将两列合并为R中的一列

时间:2015-04-14 18:06:49

标签: r merge

我有以下数据框,并尝试将两列合并为一列,同时用数值替换NA

ID    A     B
1     3     NA
2     NA    2
3     NA    4
4     1     NA

我想要的结果是:

ID    New
1     3
2     2
3     4
4     1

提前致谢!

7 个答案:

答案 0 :(得分:13)

在这种情况下,另一个非常简单的解决方案是使用rowSums函数。

df$New<-rowSums(df[, c("A", "B")], na.rm=T)
df<-df[, c("ID", "New")]

更新: 感谢@Artem Klevtsov提到此方法仅适用于数字数据。

答案 1 :(得分:11)

你也可以这样做:with(d,ifelse(is.na(A),B,A))

其中 d是您的数据框。

答案 2 :(得分:11)

在撰写答案时,这可能并不存在,但自从我来到这里时遇到了同样的问题并找到了更好的解决方案,这是针对未来的googlers:

您想要的是来自coalesce()的{​​{1}}函数:

dplyr

答案 3 :(得分:10)

您可以使用unite中的tidyr

library(tidyr)

df[is.na(df)] = ''
unite(df, new, A:B, sep='')
#  ID new
#1  1   3
#2  2   2
#3  3   4
#4  4   1

答案 4 :(得分:7)

你可以尝试

New <- do.call(pmax, c(df1[-1], na.rm=TRUE))

或者

New <-  df1[-1][cbind(1:nrow(df1),max.col(!is.na(df1[-1])))]
d1 <- data.frame(ID=df1$ID, New)
d1
#  ID New
#1  1   3
#2  2   2
#3  3   4
#4  4   1

答案 5 :(得分:5)

假设A或B都有NA,那就可以了:

# creating initial data frame (actually data.table in this case)
library(data.table)
x<- as.data.table(list(ID = c(1,2,3,4), A = c(3, NA, NA, 1), B = c(NA, 2, 4, NA)))
x
#   ID  A  B
#1:  1  3 NA
#2:  2 NA  2
#3:  3 NA  4
#4:  4  1 NA


#solution
y[,New := na.omit(c(A,B)), by = ID][,c("A","B"):=NULL]
y
#   ID New
#1:  1   3
#2:  2   2
#3:  3   4
#4:  4   1

答案 6 :(得分:1)

这个问题已经存在了一段时间,但是只是添加了另一种不依赖于任何库的可能方法:

df$new = t(df[-1])[!is.na(t(df[-1]))]

#   ID  A  B new
# 1  1  3 NA   3
# 2  2 NA  2   2
# 3  3 NA  4   4
# 4  4  1 NA   1