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