将数据框从列重塑为行并折叠单元格值

reshape dataframe from columns to rows and collapse cell values

这是我面临的挑战。我正在尝试转换此数据集

  a    b     c
  100  0     111
  0    137   17
  78   117   91

进入(列到行)

  col1  col2
  a     100,78
  b     137,117
  c     111,17,91

我知道我可以使用 reshapemelt 函数来执行此操作,但我不确定如何折叠和粘贴单元格值。感谢大家的任何建议或指示。

我会使用 dplyr 而不是重塑。

library(dplyr)
library(tidyr)

Data <- data.frame(a=c(100,0,78),b=c(0,137,117),c=c(111,17,91))

Data %>%
  gather(Column, Value) %>%
  filter(Value != 0) %>%
  group_by(Column) %>%
  summarize(Value=paste0(Value,collapse=', '))

收集功能类似于reshape中的meltgroup_by 函数告诉后面的函数你想根据 Column 中的值进行分离。最后 summarize 为每个组计算我们想要的任何摘要。在这种情况下,将所有术语粘贴在一起。

哪个应该给你:

# A tibble: 3 × 2
  Column       Value
   <chr>       <chr>
1      a     100, 78
2      b    137, 117
3      c 111, 17, 91

这是一个轻量级选项,使用 toString() 方法将每一列折叠成一个字符串,并使用 stack() 将结果列表重塑为您想要的输出:

stack(lapply(df, function(col) toString(col[col!=0])))

#       values ind
#1     100, 78   a
#2    137, 117   b
#3 111, 17, 91   c

library(data.table)

melt(dt)[, .(value = paste(value[value !=0], collapse=', ')), by=variable]
#  variable       value
# 1:      a     100, 78
# 2:      b    137, 117
# 3:      c 111, 17, 91

数据:

dt = fread("a    b     c
100  0     111
0    137   17
78   117   91")