R 根据满足给定条件的变量名生成变量
这是我数据的一小部分。我有两万多个变量和700个变量。我想做的是获取变量的一个子集,并创建一个新的变量,该子集的变量名为1。这些子集中的所有变量都将是字符变量 这就是我要找的R 根据满足给定条件的变量名生成变量,r,R,这是我数据的一小部分。我有两万多个变量和700个变量。我想做的是获取变量的一个子集,并创建一个新的变量,该子集的变量名为1。这些子集中的所有变量都将是字符变量 这就是我要找的 id gen16 gen18 gen31 gen33 gen35 gen39 gen45 gen51 gen52 gen56 gen58 gen59 gen66 gen68 V1 5962 1 1 2 2 2 2 2 2
id gen16 gen18 gen31 gen33 gen35 gen39 gen45 gen51 gen52 gen56 gen58 gen59 gen66 gen68 V1
5962 1 1 2 2 2 2 2 2 2 1 2 2 2 1 2 gen16, gen52, gen66
6085 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 gen58
6183 3 1 2 2 2 2 2 2 2 2 2 2 2 2 2 gen16
6386 4 1 2 2 2 2 2 2 2 2 2 2 2 2 2 gen16
6989 5 1 2 1 2 2 2 2 2 2 2 2 2 2 2 gen16, gen31
7057 6 2 1 1 2 2 2 1 2 2 2 2 2 2 2 gen18, gen31, gen45
7276 7 2 2 2 2 2 2 2 1 1 2 2 2 1 2 gen51, gen52, gen66
7748 8 2 1 2 2 2 2 2 1 2 2 2 2 2 2 gen18, gen51
7917 9 2 2 2 2 2 2 2 1 2 2 2 2 2 2 gen51
8654 10 2 2 2 2 2 2 2 2 2 2 2 1 2 2 gen59
我已经编写了一个for循环来实现这一点,但是我想避免这个循环,因为我的数据集只会越来越大。我的想法是编写一个只适用于一行的函数,然后使用apply函数对整个数据集进行迭代。我很幸运地得到了两个不同的函数,它们适用于一行,但是在apply函数中使用它们时出现了问题
这是我写的另外两个函数
inf.type <- function(x) {
foo <- as.data.frame(x[, c("gen16", "gen18", "gen31", "gen33", "gen35",
"gen39", "gen45", "gen51", "gen52", "gen56", "gen58", "gen59", "gen66", "gen68")] == 1)
gentypes <- paste(names(foo[colSums(foo) == "1"]), collapse = ", ")
return(gentypes)
}
inf.type <- function(x) {
foo <- x[, c("gen16", "gen18", "gen31", "gen33", "gen35", "gen39", "gen45",
"gen51", "gen52", "gen56", "gen58", "gen59", "gen66", "gen68")]
return(paste(names(foo[grep("1", foo)]), collapse = ", "))
}
inf.type这应该可以完成工作:
df$V1 = apply(df[,-1], 1, function(x) paste(names(which(x=='1')), collapse = ", "))
这将查看df[,-1]
的每一行(不包括id
列),返回与x='1'
匹配的索引(带有),提取与这些索引对应的名称,并将每一行的名称粘贴在一起
你也可以写以下内容(根据@alistaire的建议):
df[,-1]==1
将df[,-1]
转换为一个逻辑矩阵,如果它等于1
,则每个单元格计算为TRUE
,否则为FALSE
。然后可以为每一行提取那些单元格的名称
,即TRUE
,然后将这些名称与toString
连接在一起
结果:
id gen16 gen18 gen31 gen33 gen35 gen39 gen45 gen51 gen52 gen56 gen58 gen59
5962 1 1 2 2 2 2 2 2 2 1 2 2 2
6085 2 2 2 2 2 2 2 2 2 2 2 1 2
6183 3 1 2 2 2 2 2 2 2 2 2 2 2
6386 4 1 2 2 2 2 2 2 2 2 2 2 2
6989 5 1 2 1 2 2 2 2 2 2 2 2 2
7057 6 2 1 1 2 2 2 1 2 2 2 2 2
7276 7 2 2 2 2 2 2 2 1 1 2 2 2
7748 8 2 1 2 2 2 2 2 1 2 2 2 2
7917 9 2 2 2 2 2 2 2 1 2 2 2 2
8654 10 2 2 2 2 2 2 2 2 2 2 2 1
gen66 gen68 V1
5962 1 2 gen16, gen52, gen66
6085 2 2 gen58
6183 2 2 gen16
6386 2 2 gen16
6989 2 2 gen16, gen31
7057 2 2 gen18, gen31, gen45
7276 1 2 gen51, gen52, gen66
7748 2 2 gen18, gen51
7917 2 2 gen51
8654 2 2 gen59
df = structure(list(id = c("1", "2", "3", "4", "5", "6", "7", "8",
"9", "10"), gen16 = c("1", "2", "1", "1", "1", "2", "2", "2",
"2", "2"), gen18 = c("2", "2", "2", "2", "2", "1", "2", "1",
"2", "2"), gen31 = c("2", "2", "2", "2", "1", "1", "2", "2",
"2", "2"), gen33 = c("2", "2", "2", "2", "2", "2", "2", "2",
"2", "2"), gen35 = c("2", "2", "2", "2", "2", "2", "2", "2",
"2", "2"), gen39 = c("2", "2", "2", "2", "2", "2", "2", "2",
"2", "2"), gen45 = c("2", "2", "2", "2", "2", "1", "2", "2",
"2", "2"), gen51 = c("2", "2", "2", "2", "2", "2", "1", "1",
"1", "2"), gen52 = c("1", "2", "2", "2", "2", "2", "1", "2",
"2", "2"), gen56 = c("2", "2", "2", "2", "2", "2", "2", "2",
"2", "2"), gen58 = c("2", "1", "2", "2", "2", "2", "2", "2",
"2", "2"), gen59 = c("2", "2", "2", "2", "2", "2", "2", "2",
"2", "1"), gen66 = c("1", "2", "2", "2", "2", "2", "1", "2",
"2", "2"), gen68 = c("2", "2", "2", "2", "2", "2", "2", "2",
"2", "2")), class = "data.frame", .Names = c("id", "gen16", "gen18",
"gen31", "gen33", "gen35", "gen39", "gen45", "gen51", "gen52",
"gen56", "gen58", "gen59", "gen66", "gen68"), row.names = c(NA,
-10L))
数据:
id gen16 gen18 gen31 gen33 gen35 gen39 gen45 gen51 gen52 gen56 gen58 gen59
5962 1 1 2 2 2 2 2 2 2 1 2 2 2
6085 2 2 2 2 2 2 2 2 2 2 2 1 2
6183 3 1 2 2 2 2 2 2 2 2 2 2 2
6386 4 1 2 2 2 2 2 2 2 2 2 2 2
6989 5 1 2 1 2 2 2 2 2 2 2 2 2
7057 6 2 1 1 2 2 2 1 2 2 2 2 2
7276 7 2 2 2 2 2 2 2 1 1 2 2 2
7748 8 2 1 2 2 2 2 2 1 2 2 2 2
7917 9 2 2 2 2 2 2 2 1 2 2 2 2
8654 10 2 2 2 2 2 2 2 2 2 2 2 1
gen66 gen68 V1
5962 1 2 gen16, gen52, gen66
6085 2 2 gen58
6183 2 2 gen16
6386 2 2 gen16
6989 2 2 gen16, gen31
7057 2 2 gen18, gen31, gen45
7276 1 2 gen51, gen52, gen66
7748 2 2 gen18, gen51
7917 2 2 gen51
8654 2 2 gen59
df = structure(list(id = c("1", "2", "3", "4", "5", "6", "7", "8",
"9", "10"), gen16 = c("1", "2", "1", "1", "1", "2", "2", "2",
"2", "2"), gen18 = c("2", "2", "2", "2", "2", "1", "2", "1",
"2", "2"), gen31 = c("2", "2", "2", "2", "1", "1", "2", "2",
"2", "2"), gen33 = c("2", "2", "2", "2", "2", "2", "2", "2",
"2", "2"), gen35 = c("2", "2", "2", "2", "2", "2", "2", "2",
"2", "2"), gen39 = c("2", "2", "2", "2", "2", "2", "2", "2",
"2", "2"), gen45 = c("2", "2", "2", "2", "2", "1", "2", "2",
"2", "2"), gen51 = c("2", "2", "2", "2", "2", "2", "1", "1",
"1", "2"), gen52 = c("1", "2", "2", "2", "2", "2", "1", "2",
"2", "2"), gen56 = c("2", "2", "2", "2", "2", "2", "2", "2",
"2", "2"), gen58 = c("2", "1", "2", "2", "2", "2", "2", "2",
"2", "2"), gen59 = c("2", "2", "2", "2", "2", "2", "2", "2",
"2", "1"), gen66 = c("1", "2", "2", "2", "2", "2", "1", "2",
"2", "2"), gen68 = c("2", "2", "2", "2", "2", "2", "2", "2",
"2", "2")), class = "data.frame", .Names = c("id", "gen16", "gen18",
"gen31", "gen33", "gen35", "gen39", "gen45", "gen51", "gen52",
"gen56", "gen58", "gen59", "gen66", "gen68"), row.names = c(NA,
-10L))
效果很好,与我的循环结果相匹配!比我想的简单多了。谢谢我正在阅读which函数的文档,但您能更好地解释它到底在做什么以供我将来参考吗?您可以简化一下:apply(df[,-1]==1,1,函数(x)到字符串(name(x)[x])
@alistaire好主意。我添加了它作为替代方案。谢谢。@jamesguy0121我已经为我和alistaire的解决方案添加了一些解释。希望这有帮助!