如果一列中的元素不是paste0
,我想NA
两列。如果一列的一个元素是NA
,那么保留元素仅限其他专栏。
structure(list(col1 = structure(1:3, .Label = c("A", "B", "C"),
class = "factor"), col2 = c(1, NA, 3)), .Names = c("col1", "col2"),
class = "data.frame",row.names = c(NA, -3L))
# col1 col2
# 1 A 1
# 2 B NA
# 3 C 3
structure(list(col1 = structure(1:3, .Label = c("A", "B", "C"),
class = "factor"),col2 = c(1, NA, 3), col3 = c("A|1", "B", "C|3")),
.Names = c("col1", "col2", "col3"), row.names = c(NA,-3L),
class = "data.frame")
# col1 col2 col3
#1 A 1 A|1
#2 B NA B
#3 C 3 C|3
答案 0 :(得分:3)
您也可以使用正则表达式:
df$col3 <- sub("NA\\||\\|NA", "", with(df, paste0(col1, "|", col2)))
也就是说,以常规方式粘贴它们然后替换任何“NA |”或“| NA”和“”。请注意,|
需要“双重转义”,因为它在regexp中意味着“OR”,这就是为什么奇怪的模式NA\\||\\|NA
实际上意味着“NA |”或“| NA”。
答案 1 :(得分:1)
正如@Roland所说,使用ifelse
这很容易(只是将心理逻辑翻译成一系列嵌套的ifelse
语句):
x <- transform(x,col3=ifelse(is.na(col1),as.character(col2),
ifelse(is.na(col2),as.character(col1),
paste0(col1,"|",col2))))
更新:在某些情况下需要as.character
。
答案 2 :(得分:1)
尝试:
> df$col1 = as.character(df$col1)
> df$col3 = with(df, ifelse(is.na(col1),col2, ifelse(is.na(col2), col1, paste0(col1,'|',col2))))
> df
col1 col2 col3
1 A 1 A|1
2 B NA B
3 C 3 C|3
答案 3 :(得分:1)
你也可以这样做:
library(stringr)
df$col3 <- apply(df, 1, function(x)
paste(str_trim(x[!is.na(x)]), collapse="|"))
df
# col1 col2 col3
#1 A 1 A|1
#2 B NA B
#3 C 3 C|3