将数据框从列重塑为行并折叠单元格值
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
我知道我可以使用 reshape
或 melt
函数来执行此操作,但我不确定如何折叠和粘贴单元格值。感谢大家的任何建议或指示。
我会使用 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
中的melt
。 group_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")
这是我面临的挑战。我正在尝试转换此数据集
a b c
100 0 111
0 137 17
78 117 91
进入(列到行)
col1 col2
a 100,78
b 137,117
c 111,17,91
我知道我可以使用 reshape
或 melt
函数来执行此操作,但我不确定如何折叠和粘贴单元格值。感谢大家的任何建议或指示。
我会使用 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
中的melt
。 group_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")