如果不是NA,则R paste0 2列

时间:2014-09-10 14:00:11

标签: r

如果一列中的元素不是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

4 个答案:

答案 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