R 根据满足给定条件的变量名生成变量

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

这是我数据的一小部分。我有两万多个变量和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     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的解决方案添加了一些解释。希望这有帮助!