r - 如何基于以特定前缀开头并包含特定字符串的列组创建多个新列?
问题描述
我有看起来像这样的数据
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
首先,我需要确定每个前缀的适用列(因为前缀没有模式,我想我必须至少对这部分进行硬编码),然后可能以某种方式编写一个循环遍历列(存储在向量中?)为每个前缀。我倾向于在循环中引用不同的列名时遇到问题。任何帮助表示赞赏!
解决方案
这是一个基本的方法:
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)
}
这可能需要根据数据的具体细节进行修改。
推荐阅读
- python - 为什么 Python 会产生这个奇怪的广播错误?
- vb.net - 如何将 C# 对象转换转换为 VB.net 对象转换?(显示的特定转换方法)
- javascript - Express 错误:根据 HTML 规范对模块脚本强制执行严格的 MIME 类型检查
- c++ - 读取字符后无法输入整数
- python - 如何在 python 的 selenium 中进行网页抓取时单击链接?
- audio - 在 sweetalert 弹出窗口中实现声音
- python - Tensorflow 决策森林自定义指标与树的数量
- php - 如何在 PHP 中按字母顺序对 SplObjectStorage 集进行排序?
- javascript - 在选择第一个文件后激活另一个文件选择
- string - 根据第二个字符串在第一个字符串中查找唯一字符,并且在java中应该没有重复