首页 > 解决方案 > 将列名附加为行值

问题描述

假设我有以下数据框。这个想法是能够提取包含“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

标签: rdataframeappend

解决方案


我们可以使用 循环遍历行,将列值设置为 1 的apply子集,将它们一起在新的“db2”中创建“cols”列。如果需要,将空格 ( ) 更改为namespastedata.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))

推荐阅读