r - 将列名附加为行值
问题描述
假设我有以下数据框。这个想法是能够提取包含“1”作为值的列的名称,并将它们附加到具有相同“id”的新数据框中。
db<-data.frame(id=c(1,2,3,4,5,6),col1=c(0,0,0,1,0,1),col2=c(0,0,1,1,0,0),col3=c(0,0,0,0,0,1),col4=c(1,0,0,0,0,0))
id col1 col2 col3 col4
1 1 0 0 0 1
2 2 0 0 0 0
3 3 0 1 0 0
4 4 1 1 0 0
5 5 0 0 0 0
6 6 1 0 1 0
db2<-data.frame(id=c(1,2,3,4,5,6),cols=c("col4","-","col2","col1,col2","-","col1,col4"))
id cols
1 1 col4
2 2 -
3 3 col2
4 4 col1,col2
5 5 -
6 6 col1,col3
解决方案
我们可以使用 循环遍历行,将列值设置为 1 的apply
子集,将它们一起在新的“db2”中创建“cols”列。如果需要,将空格 ( ) 更改为names
paste
data.frame
""
-
db2 <- data.frame(db[1], cols = apply(db[-1], 1, function(x)
paste(names(x)[x==1], collapse=",")), stringsAsFactors = FALSE)
db2$cols[db2$cols== ""] <- "-"
db2
# id cols
#1 1 col4
#2 2 -
#3 3 col2
#4 4 col1,col2
#5 5 -
#6 6 col1,col3
或者我们可以将它矢量化为base R
m1 <- (NA^!db[-1]) * col(db[-1])
m1[] <- colnames(m1)[m1]
v1 <- do.call(paste, c(as.data.frame(m1), sep=","))
db2 <- data.frame(db[1], cols = gsub(",?NA,?", "", v1))
推荐阅读
- java - 索引 0 超出长度 0 数组 3D 的范围
- apache-spark - SPARK 持久化示例
- python - 如何使用 Python 在 Huffman 树中查找父节点的值
- python - 读取一系列标题和输入值(其中 1 <= value <= 30)的程序,如下所示,提示存储在两个列表中
- ios - Podfile.lock 版本和 pod [podfile] --版本号不同
- html - 在 Angular 中使用项目数组
- c# - 我正在使用 while 循环在 C# 中反转一个字符串我得到正确的输出但是我使用 for 循环的相同逻辑然后输出是错误的
- protractor - Visual Studio 中的 Protractor npm 安装(节点模块无法在 Visual Studio 中安装)
- python - Python嵌套/递归/树排序与熊猫
- amazon-web-services - Terraform route53 批量记录