首页 > 解决方案 > 如何基于以特定前缀开头并包含特定字符串的列组创建多个新列?

问题描述

我有看起来像这样的数据

df <- data.frame(ID = c(1,2,3,4,5,6),
                 var1_unmod = c (1,0,0,1,0,1), 
                 var1_me1 = c(0,1,0,0,0,0),
                 var1_me2 = c(1,1,1,0,1,0), 
                 var1_me3 = c(0,0,1,0,0,0),
                 var1_ac1 = c(1,0,1,1,0,1),
                 var2_unmod = c(1,0,1,1,0,0),
                 var2_me1 = c(0,0,0,0,1,0), 
                 var2_me2 = c(1,1,0,1,1,1), 
                 var2_ac1 = c(1,1,0,1,0,0), 
                 var2_me1ac1 = c(1,0,0,0,0,0), 
                 var2_me2ac1 = c(1,0,0,1,1,1))

  ID var1_unmod var1_me1 var1_me2 var1_me3 var1_ac1 var2_unmod var2_me1 var2_me2 var2_ac1 var2_me1ac1 var2_me2ac1
1  1          1        0        1        0        1          1        0        1        1           1           1
2  2          0        1        1        0        0          0        0        1        1           0           0
3  3          0        0        1        1        1          1        0        0        0           0           0
4  4          1        0        0        0        1          1        0        1        1           0           1
5  5          0        0        1        0        0          0        1        1        0           0           1
6  6          1        0        0        0        1          0        0        1        0           0           1

除了在实际数据集中,前缀不像var1和var2那样是连续的,它们基本上是字母和数字的随机组合,大约有30种不同的。

对于这些前缀中的每一个(var1、var2、...),我需要创建一个变量来指示具有该前缀的任何列是否还包含 me1、me2 或 me3(因此对于 var2,这将是 var2_me1, var2_me2, var2_me1ac1, var2_me2ac1) 非零。输出数据集将有额外的列,如下所示:

  ID var1_unmod var1_me1 var1_me2 var1_me3 var1_ac1 var1_meX var2_unmod var2_me1 var2_me2 var2_ac1 var2_me1ac1 var2_me2ac1 var2_meX
1  1          1        0        1        0        1        1          1        0        1        1           1           1        1
2  2          0        1        1        0        0        1          0        0        1        1           0           0        1
3  3          0        0        1        1        1        1          1        0        0        0           0           0        0
4  4          1        0        0        0        1        0          1        0        1        1           0           1        1
5  5          0        0        1        0        0        1          0        1        1        0           0           1        1
6  6          1        0        0        0        1        0          0        0        1        0           0           1        1

首先,我需要确定每个前缀的适用列(因为前缀没有模式,我想我必须至少对这部分进行硬编码),然后可能以某种方式编写一个循环遍历列(存储在向量中?)为每个前缀。我倾向于在循环中引用不同的列名时遇到问题。任何帮助表示赞赏!

标签: rdataframeloops

解决方案


这是一个基本的方法:

cols <- colnames(df)
varnames <- c("var1", "var2")
df2 <- df
for (i in varnames) {
    newname <- paste(i, "meX", sep="_")
    df2[, newname] <- apply(df2[, grepl(i, cols) & grepl("me", cols)], 1, sum)
    df2[, newname] <- ifelse(df2[, newname] >= 1, 1, 0)
}

这可能需要根据数据的具体细节进行修改。


推荐阅读