2017-09-22 56 views
0

我有一個數據幀有多個變量,其中有一個字符串(變量),我試圖確定an變量中的字符串是否出現在string列中。每個an變量都有相應的變量cn。例如,如果a1中的字符串出現在string中,我希望c1中包含Checked,依此類推。我爲此開發了下面的for循環解決方案(本文後面的一些示例數據),但我想知道是否有適用於此的解決方案,可能會更快,更容易編寫代碼?在真實數據中,有超過100個a和c變量。將多個for循環應用於家庭解決方案?

#For loop solution 

for (var in seq(2, 10, 2)){ 
    for (i in 1:nrow(df)){ 
    df[i, var]<-ifelse(grepl(df[i, var-1], df$string[i])=="TRUE", "Checked", "Unchecked") 
    } 
} 


#### Example data #### 
a1<-c("zebra", "giraffe", "elephant") 
a2<-c("hyena", "monkey", "antelope") 
a3<-c("badger", "deer", "kangaroo") 
a4<-c("tiger", "lion", "coyote") 
a5<-c("penguin", "bear", "gorilla") 

c1<-"" 
c2<-"" 
c3<-"" 
c4<-"" 
c5<-"" 

string<-c("elephant/bear/coyote/penguin/monkey", 
      "giraffe/antelope/monkey/gorilla/tiger", 
      "elephant/antelope/kangaroo/coyote/gorilla") 

df<-cbind.data.frame(a1, c1, a2, c2, a3, c3, a4, c4, a5, c5, string, 
stringsAsFactors=F) 

回答

0

你可以做到這一點。適用於任何數量的a。

require(dplyr) # For readability 
a<-cbind.data.frame(a1, a2, a3, a4, a5, stringsAsFactors=F) 

a %>% 
    sapply(function(x) {mapply(function(a) grepl(a, string), x) %>% diag}) %>% 
            # Check for condition in above line 
    ifelse("Checked", "Unchecked") %>% # Convert True and False to Checked and Unchecked 
    data.frame %>%      # Convert to data.frame 
    setNames(paste0("c", 1:5))   # Setnames 

     c1  c2  c3  c4  c5 
1 Unchecked Unchecked Unchecked Unchecked Checked 
2 Checked Checked Unchecked Unchecked Unchecked 
3 Checked Checked Checked Checked Checked 

在基礎R

c_column = data.frame(ifelse(sapply(a, function(x) diag(mapply(function(a) grepl(a, string), x))), "Checked", "Unchecked")) 
names(c_column) = paste0("c", 1:5) 
0

這將做你所要求的,使用sapply

df[,2*(1:5)] <- t(sapply(1:nrow(df), 
        function(i) sapply(2*(1:5)-1, 
         function(j) c("Unchecked","Checked")[1+grepl(df[i,j], df$string[i])] 
       ))) 

df 
     a1  c1  a2  c2  a3  c3  a4  c4  a5  c5         string 
1 zebra Unchecked hyena Unchecked badger Unchecked tiger Unchecked penguin Checked  elephant/bear/coyote/penguin/monkey 
2 giraffe Checked monkey Checked  deer Unchecked lion Unchecked bear Unchecked  giraffe/antelope/monkey/gorilla/tiger 
3 elephant Checked antelope Checked kangaroo Checked coyote Checked gorilla Checked elephant/antelope/kangaroo/coyote/gorilla