合并R中数据帧的列

问题描述 投票:0回答:5

我有以下数据框,

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

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

r merge
5个回答
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

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
投票

你很接近,但你将两个字符串粘在一起,其中一个字符串使用斜角括号中的字符串NA来表示任何内容,如果要将字符串粘贴在一起并希望字符串不出现在粘贴的字符串中,则需要将其作为零长度字符串。您可以使用recode中的dplyr命令执行此操作。

您可以将代码修改为:

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

1
投票

使用dplyrtidyverse的另一种方式:

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

1
投票

你可以使用rowSums

data.frame(c1 = rowSums(df,na.rm = TRUE))
#   c1
# 1  1
# 2  2
# 3  3
# 4  4
© www.soinside.com 2019 - 2024. All rights reserved.