转换数据帧并在R中对其进行汇总
所以我有一个数据框架,我想对它进行转换和总结。 现在看起来是这样的 样本数据转换数据帧并在R中对其进行汇总,r,dplyr,R,Dplyr,所以我有一个数据框架,我想对它进行转换和总结。 现在看起来是这样的 样本数据 sample_date<-data.frame(stringsAsFactors=FALSE, Date = c("2019-06-04", "2019-06-05", "2019-06-06", "2019-06-07", "2019-06-08", "2019-06-09"), apple_cost = c(6685.5601
sample_date<-data.frame(stringsAsFactors=FALSE,
Date = c("2019-06-04", "2019-06-05", "2019-06-06",
"2019-06-07", "2019-06-08", "2019-06-09"),
apple_cost = c(6685.5601, 17387.3072, 31587.2694, 7489.1275,
8490.1844, 9372.4676),
apple_count = c(601762, 557952, 1003681, 243348, 273511, 303130),
banana_cost = c(6685, 6685, 6685, 6685, 6685, 6685),
banana_count = c(557952, 557952, 557952, 557952, 557952, 557952),
orange_cost = c(6685, 6685, 6685, 6685, 6685, 6685),
orange_count = c(1003681, 1003681, 1003681, 1003681, 1003681, 1003681)
)
我想将其转换并总结为:
预期产出
Type = c("apple","banana","orange"),
cost = c(243348,343348,443348),
count = c(3003681,4003681,5003681))
我确实试着用下面的代码对它进行总结,但它看起来不像上面预期的输出。这就是我迄今为止所尝试的
我到目前为止所做的尝试
current_table <- sample_date %>%
summarise( apple_cost = sum( apple_cost, na.rm=TRUE),
apple_count = sum( apple_count, na.rm=TRUE),
banana_cost = sum( banana_cost, na.rm=TRUE),
banana_count = sum(banana_count, na.rm=TRUE),
orange_cost = sum(orange_cost, na.rm=TRUE),
orange_count = sum(orange_count, na.rm=TRUE))
一个选择是
library(dplyr)# dply_0.8.3
library(tidyr) #tidyr_0.8.3.9000
sample_date %>%
pivot_longer(-Date, names_to = c(".value", "fruits"), names_sep='_') %>%
select(-Date) %>%
group_by(fruits) %>%
summarise_all(sum)
整洁的方法
您所采用的方法非常冗长,并且需要大量特定于列和特定于列名的代码
dplyr
和tidyverse的思想是使用原则,通常涉及将数据帧重新格式化为更长的格式,每行一条记录
您可以使用以下代码来实现这一点:
sample_date %>%
gather(column, value, -Date) %>%
separate(column, into=c('fruit', 'parameter'), sep='_') %>%
spread(parameter, value) %>%
group_by(fruit) %>%
summarize(total_cost = sum(cost),
total_count = sum(count))
Date fruit cost count
2019-06-04 apple 6685.560 601762
2019-06-04 banana 6685.000 557952
2019-06-04 orange 6685.000 1003681
2019-06-05 apple 17387.307 557952
2019-06-05 banana 6685.000 557952
2019-06-05 orange 6685.000 1003681
2019-06-06 apple 31587.269 1003681
2019-06-06 banana 6685.000 557952
2019-06-06 orange 6685.000 1003681
2019-06-07 apple 7489.127 243348
2019-06-07 banana 6685.000 557952
2019-06-07 orange 6685.000 1003681
2019-06-08 apple 8490.184 273511
2019-06-08 banana 6685.000 557952
2019-06-08 orange 6685.000 1003681
2019-06-09 apple 9372.468 303130
2019-06-09 banana 6685.000 557952
2019-06-09 orange 6685.000 1003681
这里,gather()
将数据重塑为“长”格式,以便每个日期参数组合都有一个唯一的行。(“这里的参数”是“成本”或“计数”。)
不过,根据您的预期输出,可能更自然的数据视图是将每个独特的枣果组合作为一个单独的行,但在cost
和count
中有单独的列。这可以通过separate()
和spread()
函数轻松完成separate()
(和gather()
和spread()
)来自tidyr
,而不是dplyr
,但这些包通常一起使用。首先,separate()
将列
列转换为两列,水果
和参数
。然后,spread()
使用参数
列作为键,将值
列分解或“加宽”为两列。此时的结果如下所示:
sample_date %>%
gather(column, value, -Date) %>%
separate(column, into=c('fruit', 'parameter'), sep='_') %>%
spread(parameter, value) %>%
group_by(fruit) %>%
summarize(total_cost = sum(cost),
total_count = sum(count))
Date fruit cost count
2019-06-04 apple 6685.560 601762
2019-06-04 banana 6685.000 557952
2019-06-04 orange 6685.000 1003681
2019-06-05 apple 17387.307 557952
2019-06-05 banana 6685.000 557952
2019-06-05 orange 6685.000 1003681
2019-06-06 apple 31587.269 1003681
2019-06-06 banana 6685.000 557952
2019-06-06 orange 6685.000 1003681
2019-06-07 apple 7489.127 243348
2019-06-07 banana 6685.000 557952
2019-06-07 orange 6685.000 1003681
2019-06-08 apple 8490.184 273511
2019-06-08 banana 6685.000 557952
2019-06-08 orange 6685.000 1003681
2019-06-09 apple 9372.468 303130
2019-06-09 banana 6685.000 557952
2019-06-09 orange 6685.000 1003681
您想要的输出似乎要对所有日期进行求和,但要分别处理每种水果类型。这就是为什么我们在做summary()
之前要按(水果)分组
整个代码块的最终输出如下所示
fruit total_cost total_count
apple 81011.92 2983384
banana 40110.00 3347712
orange 40110.00 6022086
这并不完全是你想要的格式,但是对于tidyverse来说,这是一种更自然的格式
您提供的数据与预期输出之间的差异
您期望的值似乎不是从您提供的示例数据中产生的。您尝试的代码给出了“正确”的数字,至少据我所知。例如,
81011.92
是苹果所有成本的总和,而不是你所说的243348。不清楚你想如何计算。如果你做的是总和,它会给出相同的结果。我想总结每种水果的成本和计数,并在每一列中显示出来。我尝试了不同的方法,但即使是计数和成本的总和也没有给出预期的结果。谢谢。我很抱歉,我只是用了虚拟数字。哇,这是一个令人惊讶的解释。您将如何处理NA的成本和计数。我尝试了na.rm=true
,但似乎不起作用哇,这是一个令人惊讶的解释。您将如何处理NA的成本和计数。我尝试了na.rm=true
,但似乎不起作用。你应该能够做例如summary(total_cost=sum(cost,na.rm=true)
(注意true
必须是大写)。我找到了。非常感谢你的详细解释!!pivot\u longer
抛出一个错误:找不到函数“pivot\u longer”
@SNT这是tidyr的开发版本。对不起
fruit total_cost total_count
apple 81011.92 2983384
banana 40110.00 3347712
orange 40110.00 6022086