Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
转换数据帧并在R中对其进行汇总_R_Dplyr - Fatal编程技术网

转换数据帧并在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