将含有NA的列合并到新列,并将其附加到现有数据框中。

3

我有一个数据框,其中包含几列,特定两列的头部如下所示(总共有几千行):

  corprsd1 corprsd2
2        1       NA
3       NA        0
4       NA        0
5        1       NA
6        1       NA
7       NA        0

由于每一行中一个列中的NA总是对应第二列中的0或1,因此我想将这些行合并为1行,并将其附加到当前数据框中,以获得以下结果:

  corprsd1 corprsd2 corcombined
2        1       NA       1
3       NA        0       0
4       NA        0       0
5        1       NA       1
6        1       NA       1
7       NA        0       0

我想这可以通过循环或某些特定的函数来完成 - 你能否给我提供最佳解决方案的提示? 我猜想某个函数可能是最快的,但循环应该更加灵活(例如,我可以更改组合列的条件)。

6
请查看?rowSums,并使用na.rm=TRUE参数。该参数可帮助您在计算行和时忽略缺失值。 - talat
2个回答

2
更简单的方法是:
df <- data.frame(
  corprsd1 = c(1, NA, NA, 1, 1, NA),
  corprsd2 = c(NA, 0, 0, NA, NA, 0)
)

df$combined <- rowSums(df, na.rm = T)

这将产生预期的输出:

  corprsd1 corprsd2 combined
1        1       NA        1
2       NA        0        0
3       NA        0        0
4        1       NA        1
5        1       NA        1
6       NA        0        0

1
你不需要使用循环。更快的方法是简单地使用is.narowSums
corprsd1 <- c(1, NA, NA, 1, 1, NA)
corprsd2 <- c(NA, 0, 0, NA, NA, 0)
table <- cbind(corprsd1, corprsd2)     # generate your original table without the rownames of 2:7
table[is.na(table)] <- 0     # replace NAs with 0s
table2 <- cbind(table, rowSums(table))     # generates new table with rowSums
colnames(table2) <- c("corprsd1", "corprsd2", "corcombined")
rownames(table2) <- c(2:7)
table2

Which produces

  corprsd1 corprsd2 corcombined
2        1       NA           1
3       NA        0           0
4       NA        0           0
5        1       NA           1
6        1       NA           1
7       NA        0           0

1
是的,实际上这一行代码也可以完成任务: p1$corpress <- rowSums(p1[,17:18], na.rm=TRUE) - Bartosz M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接