【问题标题】:Append column names as a row value将列名附加为行值
【发布时间】:2019-05-13 20:20:36
【问题描述】:

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

【问题讨论】:

  • 最后一行应该是col1,col3

标签: r dataframe append


【解决方案1】:

我们可以遍历带有apply 的行,将列值为1 的names 子集化,paste 将它们组合在一起以在新的data.frame 'db2' 中创建'cols' 列。如果需要,将空格 ("") 更改为 -

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))

【讨论】:

  • 太棒了!所以,最终的代码是。 db
【解决方案2】:

另一个使用 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 &lt;- unlist(.SD))[row == 1]))

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

【讨论】:

  • 非常令人印象深刻。谢谢
猜你喜欢
  • 2019-12-18
  • 2021-08-08
  • 2022-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2020-01-19
相关资源
最近更新 更多