基于其他变量创建新变量,并在R中的变量名称上循环

时间:2018-08-05 20:05:18

标签: r tidyverse

我有一个数据集,其变量名为I10AA至I10ZZ和I11AA至I11ZZ。我想为IZZ创建新的变量IAA,以便IAA = function(I10AA,I11AA)。

作为一个高度简化的示例。

set.seed(0)

df <- data.frame(I10AA=floor(runif(10,1,5)),I10AB=floor(runif(10,1,5)),
             I11AA=floor(runif(10,1,5)),I11AB=floor(runif(10,1,5)))

fun <- function(x,y) (x+y)

results <- df %>% mutate(IAA = fun(I10AA,I11AA),IAB = fun(I10AB,I11AB))

print(results)

结果是我想要的最终数据集。

有没有办法用tidyverse做到这一点?

在原始数据集中,变量的排列方式为:

 colnames(original_data) = "ID","I1AA", "I1AB", "I1AC", ... , "I1ZZ", "I2AA","I2AB",...,"I2ZZ",...,"I10AA",...,"I10ZZ","I11AA",..."I11ZZ"

1 个答案:

答案 0 :(得分:1)

我们可以遍历列名,使用location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/run/php/php7.0-fpm.sock; } 创建新列,使用列名的子字符串重命名列并与原始数据绑定

transmute

或者另一个选择是将数据集的子集放置在library(tidyverse) i1 <- grepl("10", names(df)) nm1 <- sub("\\d+", "", names(df)[i1]) i2 <- !i1 map2(names(df)[i1], names(df)[i2], ~ df %>% transmute(fun(!! rlang::sym(.x), !!rlang::sym(.y)))) %>% bind_cols %>% rename_all(., ~ nm1) %>% bind_cols(df, .) # I10AA I10AB I11AA I11AB IAA IAB #1 4 1 4 2 8 3 #2 2 1 4 2 6 3 #3 2 1 1 3 3 4 #4 3 3 3 2 6 5 #5 4 2 1 1 5 3 #6 1 4 2 4 3 8 #7 4 2 2 3 6 5 #8 4 3 1 4 5 7 #9 3 4 2 1 5 5 #10 3 2 4 3 7 5 中,并使用list传递reduce

+

一个更简单的选择是

list(df %>% 
        select(names(.)[i1]),
     df %>%
        select(names(.)[i2])) %>% 
  reduce(`+`) %>% 
  rename_all(., ~ nm1) %>% 
  bind_cols(df, .)