根据通用 ID 删除 NA 的行组合
Row combination to remove NA's based on common ID's
我最近在 link () 中问了一个关于 R 包 tidyr、dplyr 或类似的数据库管理的问题。
这很有帮助,我设法完成了建议的代码,但我对我需要的最终格式感到困惑。
我无法达到这种格式,想知道如何轻松完成。
将此作为示例数据库:
Factor 1 Factor 2 Year value1 value2
A green 2016 1.9 20
A green 2015 1.9 20
A green 2015 4 30
B yellow 2015 3 10
B yellow 2016 8 11
并试图获得:
Factor 1 Factor 2 value1.2015 value1.2016 value2.2015 value2.2016
A green 5.9 1.9 50 20
B yellow 3 8 10 11
因此,它将为因子 1 和因子 2 设置公共标识符,以按年份分布数据集并汇总值 1 和 2 的公共年份
我是 tidyr、dplyr 的初学者,无法轻松做到这一点。
我多年来一直能够传播数据集:
df.spread<-df %>%
gather(value1,value2,-factor1,-factor2,-Year) %>%
unite(Year,Year, value1, sep = "") %>%
spread(Year,value2)
但这并没有像我想要的那样对常见年份的 value1 求和。
我们按'Factor1'、'Factor2'、'Year'分组,得到所有列(summarise_all
)的sum
,然后gather
转换为 'long' 格式,unite
将 'Year'、'key' 列组合在一起以创建单个列,并且 spread
从 'long' 到 'wide'格式
library(tidyverse)
df %>%
group_by(Factor1, Factor2, Year) %>%
summarise_all(sum) %>%
gather(key, value, value1:value2) %>%
unite(Year, key, Year, sep=".") %>%
spread(Year, value)
# Groups: Factor1, Factor2 [2]
# Factor1 Factor2 value1.2015 value1.2016 value2.2015 value2.2016
# <chr> <chr> <dbl> <dbl> <dbl> <dbl>
#1 A green 5.9 1.9 50 20
#2 B yellow 3 8 10 11
这也可以通过 data.table
中的 dcast
来完成,我们可以在其中传递多个 value.var
列和一个 fun.aggregate
参数
library(data.table)
dcast(setDT(df), Factor1 + Factor2 ~ Year, value.var = c('value1', 'value2'), sum)
# Factor1 Factor2 value1_2015 value1_2016 value2_2015 value2_2016
#1: A green 5.9 1.9 50 20
#2: B yellow 3.0 8.0 10 11
数据
df <- structure(list(Factor1 = c("A", "A", "A", "B", "B"), Factor2 = c("green",
"green", "green", "yellow", "yellow"), Year = c(2016L, 2015L,
2015L, 2015L, 2016L), value1 = c(1.9, 1.9, 4, 3, 8), value2 = c(20L,
20L, 30L, 10L, 11L)), class = "data.frame", row.names = c(NA,
-5L))
我最近在 link (
这很有帮助,我设法完成了建议的代码,但我对我需要的最终格式感到困惑。
我无法达到这种格式,想知道如何轻松完成。
将此作为示例数据库:
Factor 1 Factor 2 Year value1 value2
A green 2016 1.9 20
A green 2015 1.9 20
A green 2015 4 30
B yellow 2015 3 10
B yellow 2016 8 11
并试图获得:
Factor 1 Factor 2 value1.2015 value1.2016 value2.2015 value2.2016
A green 5.9 1.9 50 20
B yellow 3 8 10 11
因此,它将为因子 1 和因子 2 设置公共标识符,以按年份分布数据集并汇总值 1 和 2 的公共年份
我是 tidyr、dplyr 的初学者,无法轻松做到这一点。
我多年来一直能够传播数据集:
df.spread<-df %>%
gather(value1,value2,-factor1,-factor2,-Year) %>%
unite(Year,Year, value1, sep = "") %>%
spread(Year,value2)
但这并没有像我想要的那样对常见年份的 value1 求和。
我们按'Factor1'、'Factor2'、'Year'分组,得到所有列(summarise_all
)的sum
,然后gather
转换为 'long' 格式,unite
将 'Year'、'key' 列组合在一起以创建单个列,并且 spread
从 'long' 到 'wide'格式
library(tidyverse)
df %>%
group_by(Factor1, Factor2, Year) %>%
summarise_all(sum) %>%
gather(key, value, value1:value2) %>%
unite(Year, key, Year, sep=".") %>%
spread(Year, value)
# Groups: Factor1, Factor2 [2]
# Factor1 Factor2 value1.2015 value1.2016 value2.2015 value2.2016
# <chr> <chr> <dbl> <dbl> <dbl> <dbl>
#1 A green 5.9 1.9 50 20
#2 B yellow 3 8 10 11
这也可以通过 data.table
中的 dcast
来完成,我们可以在其中传递多个 value.var
列和一个 fun.aggregate
参数
library(data.table)
dcast(setDT(df), Factor1 + Factor2 ~ Year, value.var = c('value1', 'value2'), sum)
# Factor1 Factor2 value1_2015 value1_2016 value2_2015 value2_2016
#1: A green 5.9 1.9 50 20
#2: B yellow 3.0 8.0 10 11
数据
df <- structure(list(Factor1 = c("A", "A", "A", "B", "B"), Factor2 = c("green",
"green", "green", "yellow", "yellow"), Year = c(2016L, 2015L,
2015L, 2015L, 2016L), value1 = c(1.9, 1.9, 4, 3, 8), value2 = c(20L,
20L, 30L, 10L, 11L)), class = "data.frame", row.names = c(NA,
-5L))