2017-09-28 4 views
0

複数の条件で多くの変数があるデータフレームがあります。私は条件ごとに各変数をマージしたいと思います。可変番号でループする変数をマージする方法R

サンプルデータフレームは、私が持っているもの(2つの条件を超える3つの変数)の簡略版です。

私は、元のデータフレームに付加し、これで終わりにしたい
VAR.B_1 <- c(1, 2, 3, 4, 5, 'NA', 'NA', 'NA', 'NA', 'NA') 
VAR.B_2 <- c(2, 2, 3, 4, 5,'NA', 'NA', 'NA', 'NA', 'NA') 
VAR.B_3 <- c(1, 1, 1, 1, 1,'NA', 'NA', 'NA', 'NA', 'NA') 
VAR.E_1 <- c(NA, NA, NA, NA, NA, 1, 1, 1, 1, 1) 
VAR.E_2 <- c(NA, NA, NA, NA, NA, 1, 2, 3, 4, 5) 
VAR.E_3 <- c(NA, NA, NA, NA, NA, 1, 1, 1, 1, 1) 
Condition <- c("B", "B","B","B","B","E","E","E","E","E") 

#Example dataset 
data<-as.data.frame(cbind(VAR.B_1,VAR.B_2,VAR.B_3, VAR.E_1,VAR.E_2, VAR.E_3, Condition)) 

VAR_1 VAR_2 VAR_3 
1  2  1  
2  2  1  
3  3  1  
4  4  1  
5  5  1 
1  1  1  
1  2  1    
1  3  1    
1  4  1    
1  5  1    

私はRは、変数名の内側に私では動作しないことを理解し、私は例を持っています私がやろうとしていたループの種類。変数がたくさんあるので、私はむしろ列の場所で変数を呼び出すことはありません。

##Example of how I want to merge - this code does not work 
for(i in 1:3) { 
    data$VAR_[,i] <-ifelse(data$Condition == "B", VAR.B_[,i], 
      ifelse(data$Condition == "E", VAR.E_[,i], NA)) 
} 

答えて

0

データには2種類のNA値が含まれているようです。それはNA、またはRのNAの値を持ち、文字列は'NA'です。下の私の解答では、両方をゼロに置き換え、データフレーム内の各列を数値にキャストしてから、番号がVAR列のようにまとめてください。次に、不要な元の列を削除します。

data <- as.data.frame(cbind(VAR.B_1,VAR.B_2,VAR.B_3, VAR.E_1,VAR.E_2, VAR.E_3), 
         stringsAsFactors=FALSE) 
data[is.na(data)] <- 0 
data[data == 'NA'] <- 0 
data <- as.data.frame(lapply(data, as.numeric)) 

data$VAR_1 <- data$VAR.B_1 + data$VAR.E_1 
data$VAR_2 <- data$VAR.B_2 + data$VAR.E_2 
data$VAR_3 <- data$VAR.B_3 + data$VAR.E_3 

data <- data[c("VAR_1", "VAR_2", "VAR_3")] 

Demo

0
data.frame(lapply(split.default(data[-NCOL(data)], gsub("\\D+", "", head(names(data), -1))), 
     function(a){ 
      a = sapply(a, function(x) as.numeric(as.character(x))) 
      rowSums(a, na.rm = TRUE) 
     })) 
# X1 X2 X3 
#1 1 2 1 
#2 2 2 1 
#3 3 3 1 
#4 4 4 1 
#5 5 5 1 
#6 1 1 1 
#7 1 2 1 
#8 1 3 1 
#9 1 4 1 
#10 1 5 1 
#Warning messages: 
#1: In FUN(X[[i]], ...) : NAs introduced by coercion 
#2: In FUN(X[[i]], ...) : NAs introduced by coercion 
#3: In FUN(X[[i]], ...) : NAs introduced by coercion 
1

これはあなたの状況のた​​めに働くかもしれません:

library(tidyverse) 
library(stringr) 
data %>% 
    mutate_all(as.character) %>% 
    gather(key, value, -Condition) %>% 
    filter(!is.na(value), value != "NA") %>% 
    mutate(key = str_replace(key, paste0("\\.", Condition), "")) %>% 
    group_by(Condition, key) %>% 
    mutate(rowid = 1:n()) %>% 
    spread(key, value) %>% 
    bind_cols(data) 
#> # A tibble: 10 x 12 
#> # Groups: Condition [2] 
#> Condition rowid VAR_1 VAR_2 VAR_3 VAR.B_1 VAR.B_2 VAR.B_3 VAR.E_1 
#>  <chr> <int> <chr> <chr> <chr> <fctr> <fctr> <fctr> <fctr> 
#> 1   B  1  1  2  1  1  2  1  NA 
#> 2   B  2  2  2  1  2  2  1  NA 
#> 3   B  3  3  3  1  3  3  1  NA 
#> 4   B  4  4  4  1  4  4  1  NA 
#> 5   B  5  5  5  1  5  5  1  NA 
#> 6   E  1  1  1  1  NA  NA  NA  1 
#> 7   E  2  1  2  1  NA  NA  NA  1 
#> 8   E  3  1  3  1  NA  NA  NA  1 
#> 9   E  4  1  4  1  NA  NA  NA  1 
#> 10   E  5  1  5  1  NA  NA  NA  1 
#> # ... with 3 more variables: VAR.E_2 <fctr>, VAR.E_3 <fctr>, 
#> # Condition1 <fctr> 
関連する問題