将列名称附加为行值

时间:2018-12-12 17:01:23

标签: r dataframe append

假设我有以下数据框。这样做的目的是能够提取包含“ 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

2 个答案:

答案 0 :(得分:1)

我们可以使用self.GetFieldRect(1)遍历各行,将apply的子集(其中列值为1,names)一起在新的{{1中创建'cols'列}}'db2'。如果需要,将空格(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

答案 1 :(得分:1)

另一个使用data.table的选项

library(data.table)
setDT(db)

db[, .(.(names(row <- unlist(.SD))[row == 1])), by = id]

#    id        V1
# 1:  1      col4
# 2:  2          
# 3:  3      col2
# 4:  4 col1,col2
# 5:  5          
# 6:  6 col1,col3

或者如果您要将其添加为新列

db[, cols := .(.(names(row <- unlist(.SD))[row == 1])), by = id]


#    id col1 col2 col3 col4      cols
# 1:  1    0    0    0    1      col4
# 2:  2    0    0    0    0          
# 3:  3    0    1    0    0      col2
# 4:  4    1    1    0    0 col1,col2
# 5:  5    0    0    0    0          
# 6:  6    1    0    1    0 col1,col3

请注意,上面的代码创建的是一列列表,而不是akrun的答案中的字符向量列。如果要使用字符向量列,请替换

.(.(names(row <- unlist(.SD))[row == 1]))

paste(names(row <- unlist(.SD))[row == 1], collapse = ',')