以下是数据片段:

Tab1 <- read.table(text = "
  nodepair ES1 ES2 ++ -- +- -+ 0+ +0 0- -0 00
1     E_A6   3   3  0  0  0  0  0  0  0  0  1
2     E_A6   4   3 NA NA NA NA NA NA NA NA NA
3     E_A6   5   3 NA NA NA NA NA NA NA NA NA
4     E_AL   3   3  0  5  0  0  0  0  0  0  1
5     E_AL   4   3 NA NA NA NA NA NA NA NA NA
6     E_AL   5   3 NA NA NA NA NA NA NA NA NA   
", header = TRUE)

对于每个 node 对组,我想用ES2等于ES1的行中的值替换包含NA的行,前提是它与NA行的ES2匹配. 然后我需要将NA分配给先前NA行的ES1列.

如下所示:

Tab2 <- read.table(text = "
  nodepair ES1 ES2 ++ -- +- -+ 0+ +0 0- -0 00
1     E_A6   3   3  0  0  0  0  0  0  0  0  1
2     E_A6   NA  3  0  0  0  0  0  0  0  0  1
3     E_A6   NA  3  0  0  0  0  0  0  0  0  1
4     E_AL   3   3  0  5  0  0  0  0  0  0  1
5     E_AL   NA  3  0  5  0  0  0  0  0  0  1
6     E_AL   NA  3  0  5  0  0  0  0  0  0  1   
", header = TRUE)

我一直在try 这样的逻辑:

Tab2 <- Tab1  %>%
  rowwise %>%
  mutate(across(4:12, ~ifelse(is.na(rowsums), ???, .))))

推荐答案

也许for-loop会起作用?例如.

Tab1 <- read.table(text = "
  nodepair ES1 ES2 ++ -- +- -+ 0+ +0 0- -0 00
1     E_A6   3   3  0  0  0  0  0  0  0  0  1
2     E_A6   4   3 NA NA NA NA NA NA NA NA NA
3     E_A6   5   3 NA NA NA NA NA NA NA NA NA
4     E_AL   3   3  0  5  0  0  0  0  0  0  1
5     E_AL   4   3 NA NA NA NA NA NA NA NA NA
6     E_AL   5   3 NA NA NA NA NA NA NA NA NA   
", header = TRUE,  check.names = FALSE)

for (i in 1:nrow(Tab1)) {
  if (Tab1[i,2] == Tab1[i,3]) {
    stored_line <- Tab1[i,4:12]
  }
  if (all(is.na(Tab1[i,4:12]))) {
    Tab1[i,4:12] <- stored_line
    Tab1[i,2] <- NA
  }
}

Tab1
#>   nodepair ES1 ES2 ++ -- +- -+ 0+ +0 0- -0 00
#> 1     E_A6   3   3  0  0  0  0  0  0  0  0  1
#> 2     E_A6  NA   3  0  0  0  0  0  0  0  0  1
#> 3     E_A6  NA   3  0  0  0  0  0  0  0  0  1
#> 4     E_AL   3   3  0  5  0  0  0  0  0  0  1
#> 5     E_AL  NA   3  0  5  0  0  0  0  0  0  1
#> 6     E_AL  NA   3  0  5  0  0  0  0  0  0  1

我try 使用连接,但无法确定边缘情况,例如,如果一行具有Nas和值:

# add some sevens to line 2
Tab1 <- read.table(text = "
  nodepair ES1 ES2 ++ -- +- -+ 0+ +0 0- -0 00
1     E_A6   3   3  0  0  0  0  0  0  0  0  1
2     E_A6   4   3 NA NA NA NA NA NA NA  7  7
3     E_A6   5   3 NA NA NA NA NA NA NA NA NA
4     E_AL   3   3  0  5  0  0  0  0  0  0  1
5     E_AL   4   3 NA NA NA NA NA NA NA NA NA
6     E_AL   5   3 NA NA NA NA NA NA NA NA NA   
", header = TRUE,  check.names = FALSE)

# solution from @thelatemail's comment:
library(tidyverse)
Tab1 %>% select(nodepair,ES2) %>% left_join(Tab1 %>% filter(ES1 == ES2), by=c("nodepair","ES2"))
#>   nodepair ES2 ES1 ++ -- +- -+ 0+ +0 0- -0 00
#> 1     E_A6   3   3  0  0  0  0  0  0  0  0  1
#> 2     E_A6   3   3  0  0  0  0  0  0  0  0  1
#> 3     E_A6   3   3  0  0  0  0  0  0  0  0  1
#> 4     E_AL   3   3  0  5  0  0  0  0  0  0  1
#> 5     E_AL   3   3  0  5  0  0  0  0  0  0  1
#> 6     E_AL   3   3  0  5  0  0  0  0  0  0  1

# compared to the for-loop approach
for (i in 1:nrow(Tab1)) {
  if (Tab1[i,2] == Tab1[i,3]) {
    stored_line <- Tab1[i,4:12]
  }
  if (all(is.na(Tab1[i,4:12]))) {
    Tab1[i,4:12] <- stored_line
    Tab1[i,2] <- NA
  }
}
Tab1
#>   nodepair ES1 ES2 ++ -- +- -+ 0+ +0 0- -0 00
#> 1     E_A6   3   3  0  0  0  0  0  0  0  0  1
#> 2     E_A6   4   3 NA NA NA NA NA NA NA  7  7
#> 3     E_A6  NA   3  0  0  0  0  0  0  0  0  1
#> 4     E_AL   3   3  0  5  0  0  0  0  0  0  1
#> 5     E_AL  NA   3  0  5  0  0  0  0  0  0  1
#> 6     E_AL  NA   3  0  5  0  0  0  0  0  0  1

创建于2024-02-06年第reprex v2.1.0

R相关问答推荐

如果索引重复,聚合xts核心数据

根据收件箱中的特定值提取列名

如果列中存在相同的字符串,则对行值进行总和

如何使用rmarkdown和kableExtra删除包含折叠行的表的第一列的名称

x[[1]]中的错误:脚注越界

r替换lme S4对象的字符串的一部分

如何动态更新selectizeInput?

在连续尺度上转置标签[瀑布图,R]

多个过滤器内的一个盒子在仪表板Quarto

在ggplot2中更改小提琴情节的顺序

多个模拟序列间的一种预测回归关系

LOF中的插图短文字幕

用R ggplot2求上、下三角形中两个变量的矩阵热图

将箭头绘制在图形外部,而不是图形内部

从多个可选列中选取一个值到一个新列中

如何使用前缀作为匹配来连接数据帧?

我如何使用tidyselect来传递一个符号数组,比如Pivot_Long?

避免在图例中显示VLINS组

长/纬点继续在堪萨斯-SF结束,整齐的人口普查

GgHighlight找不到它创建的列:`Highlight..1`->;`Highlight.....`