2014-09-10 2 views
0

한 열의 요소가 NA이 아닌 경우 paste0 두 열을 입력하고 싶습니다. 한 열의 요소
NA 인 경우 다른 열의 요소 만 유지하십시오. @Roland가 말한대로R paste0 2 열이 아닌 경우 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

당신이 붙어 어디? 이것은'ifelse'를 사용하여 쉽습니다. – Roland

+0

당신은 당신이'paste0'을 사용하기를 원하지만, 당신의 예제는'paste'의 결과처럼 보입니다. ... –

+0

@BenBolker 그건 내 오타였습니다. 나는 past0을 의미했다. 그것을 바로 잡을 것입니다. ifelse없이이 작업을 수행 할 수있는 방법이 있습니까? – DJJ

답변

1

, 이것은 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합니다.

+0

나는 당신의 방법을 시도하고 3 열의 B 대신 2를 얻었다. 그것은 내가 다른 길을 찾고 싶었던 이유의 일부였다. – DJJ

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

:

어떤 대체 한 후 일정한 방법으로 그들을 붙여이다
df$col3 <- sub("NA\\||\\|NA", "", with(df, paste0(col1, "|", col2))) 

"NA를 |" 또는 "| NA"에 ""를 입력하십시오. |은 regexps에서 "OR"을 의미하므로 "이중 이스케이프 처리"해야합니다. 이상한 패턴 NA\\||\\|NA은 실제로 "NA |"를 의미합니다. 또는 "| NA".

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