如何在R中合并由变量数循环的变量

时间:2017-09-28 01:40:04

标签: 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不会在变量名中使用i,但我有一个我试图做的for循环的例子。我宁愿不按列位置调用变量,因为会有很多变量。

##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))
}

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

您的数据似乎包含两种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")]

np.meshgrid

答案 2 :(得分: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