我有以下数据框,
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
有人可以就如何获得所需的输出提出建议吗?
由于看起来数据帧实际上包含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
一种方法是:
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
你很接近,但你将两个字符串粘在一起,其中一个字符串使用斜角括号中的字符串NA来表示任何内容,如果要将字符串粘贴在一起并希望字符串不出现在粘贴的字符串中,则需要将其作为零长度字符串。您可以使用recode
中的dplyr
命令执行此操作。
您可以将代码修改为:
library(dplyr)
df <- mutate(df, x =paste0(recode(c1,"<NA>" = ""),recode(c2,"<NA>" = "")))
使用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
你可以使用rowSums
:
data.frame(c1 = rowSums(df,na.rm = TRUE))
# c1
# 1 1
# 2 2
# 3 3
# 4 4