2016-04-19 9 views
0

私は以下のようなデータフレームを持っています。列の範囲に文字列が含まれている場合は、新しい列を追加してください。

ContainsANZ:私は2列を追加したいと思いF3へのF0から任意の列が含まれている「オーストラリア」かどうかを示しますか 'ニュージーランド無視NAは

AllANZ値:すべての非NAの列が含まれているかどうかを示します "オーストラリア」または 'ニュージーランド

開始データフレームは次のようになります。

dfContainsANZ 
    Col.A Col.B Col.C   F0   F1   F2  F3 
1 data  0 xxx  Australia  Singapore   <NA>  <NA> 
2 data  1 yyy United States United States United States  <NA> 
3 data  0 zzz  Australia  Australia  Australia Australia 
4 data  0 ooo  Hong Kong  London  Australia  <NA> 
5 data  1 xxx New Zealand   <NA>   <NA>  <NA> 

最終的な結果は次のようになります。 10

私はdplyr(推奨ソリューション)を使用していますが、このようなコードは、うまくいかず、非常に反復的です。 F0 | F1 | F2 ...の規則をもう一度コピーする必要がないように、これを書き込む方がいいですか?私の実際のデータセットにはより多くのものがあります。 NAsはコードに干渉していますか?

df <- df %>% 
mutate(ANZFlag = 
    ifelse(
    F0 == 'Australia' | 
    F1 == 'Australia' | 
    F2 == 'Australia' | 
    F3 == 'Australia', 
    'Australia', 
     ifelse(
     F0 == 'New Zealand' | 
     F1 == 'New Zealand' | 
     F2 == 'New Zealand' | 
     F3 == 'New Zealand', 
     'New Zealand', 'undefined' 
     ) 
    ) 
) 
+0

あなたは 'rowSums(DF [paste0(のようなスピードワイズ非常に競争力のあることを行うことができます"F"、0:3)] == "Australia"、na.rm = TRUE)> 0 "を使用して特定の値が存在するかどうかを調べます。 – thelatemail

+0

ありがとう、それは本当に便利です。 hrbrmstrの解決策をそれに与えます。 – LoLo

答えて

1

それでもいくつかのタイピングが、私は、これはあなたが探している本質的になると思う:

library(dplyr) 

df <- read.table(text='Col.A,Col.B,Col.C,F0,F1,F2,F3 
data,0,xxx,Australia,Singapore,NA,NA 
data,1,yyy,"United States","United States","United States",NA 
data,0,zzz,Australia,Australia,Australia,Australia 
data,0,ooo,"Hong Kong",London,Australia,NA 
data,1,xxx,"New Zealand",NA,NA,NA', header=TRUE, sep=",", stringsAsFactors=FALSE) 

down_under <- function(x) { 
    mtch <- c("Australia", "New Zealand") 
    cols <- unlist(x)[c("F0", "F1", "F2", "F3")] 
    bind_cols(x, data_frame(ContainsANZ=any(mtch %in% cols, na.rm=TRUE), 
          AllANZ=all(as.vector(na.omit(cols)) %in% cols))) 
} 

rowwise(df) %>% do(down_under(.)) 

## Source: local data frame [5 x 9] 
## Groups: <by row> 
## 
## Col.A Col.B Col.C   F0   F1   F2  F3 ContainsANZ AllANZ 
## (chr) (int) (chr)   (chr)   (chr)   (chr)  (chr)  (lgl) (lgl) 
## 1 data  0 xxx  Australia  Singapore   NA  NA  TRUE TRUE 
## 2 data  1 yyy United States United States United States  NA  FALSE TRUE 
## 3 data  0 zzz  Australia  Australia  Australia Australia  TRUE TRUE 
## 4 data  0 ooo  Hong Kong  London  Australia  NA  TRUE TRUE 
## 5 data  1 xxx New Zealand   NA   NA  NA  TRUE TRUE 
関連する問題