合并R中数据框的列

时间:2018-09-07 11:27:22

标签: r merge

我有以下数据框,

c1 <- c(1,2,"<NA>","<NA>")
c2 <- c("<NA>","<NA>",3,4)
df <- data.frame(c1,c2)

>df 

    c1   c2
1    1 <NA>
2    2 <NA>
3 <NA>    3
4 <NA>    4

以下是我合并第1,2列后想要获得的期望输出

  >df 

    c1  
1    1 
2    2
3    3
4    4

我尝试过

df <- mutate(df, x =paste(c1,c2))

给出

> df
    c1   c2      x
1    1 <NA> 1 <NA>
2    2 <NA> 2 <NA>
3 <NA>    3 <NA> 3
4 <NA>    4 <NA> 4

有人可以提供有关如何获得所需输出的建议吗?

5 个答案:

答案 0 :(得分:2)

这是一种方法:

c1 <- c(1, 2, NA, NA)
c2 <- c(NA, NA, 3, 4)
df <- data.frame(c1, c2)

df2 <- data.frame(
  c1 = ifelse(is.na(df$c1), df$c2, df$c1)
)

#df2
#  c1
#1  1
#2  2
#3  3
#4  4

答案 1 :(得分:1)

您很近,但是您要将两个字符串粘贴在一起,其中一个使用尖括号中的字符串NA表示什么,如果您将字符串粘贴在一起并且希望一个字符串不出现在粘贴的字符串中,则需要使用它作为零长度的字符串。您可以使用recode中的dplyr命令来完成此操作。

您可以将代码修改为:

library(dplyr)
df <- mutate(df, x =paste0(recode(c1,"<NA>" = ""),recode(c2,"<NA>" = "")))

答案 2 :(得分:1)

使用dplyr中的tidyverse的另一种方法:

df2 <- df %>% 
    mutate(c3 = if_else(is.na(c1),c2,c1)) %>% 
    select(-c1, -c2) %>% # Given you only wanted one column
    rename(c1 = c3) # Given you wanted the column to be called c1

输出:

  c1
1  1
2  2
3  3
4  4

答案 3 :(得分:1)

您可以使用rowSums

data.frame(c1 = rowSums(df,na.rm = TRUE))
#   c1
# 1  1
# 2  2
# 3  3
# 4  4

答案 4 :(得分:0)

由于似乎数据框实际上包含NA值而不是'<NA>'字符串,所以我建议使用coalesce

c1 <- c(1,2,NA, NA)
c2 <- c(NA, NA,3,4)
df <- data.frame(c1,c2)

library(tidyverse)
df %>% 
  mutate(c3=coalesce(c1, c2))

输出:

   c1 c2 c3
1  1 NA  1
2  2 NA  2
3 NA  3  3
4 NA  4  4