聚集,重塑,演员等之间的区别

时间:2018-04-15 21:51:17

标签: r data.table reshape tidyr

聚集,重塑,演员和类似功能有什么区别?我知道他们都有助于在长数据和宽数据之间进行转换,但我在使用它们时遇到了麻烦。文档倾向于使用" id"等术语。变量和"时间"变量,但我不确定是什么。

我有一个这样的数据框:

data <- data.frame(id = c(rep("A", 10), rep("B", 10), rep("C", 10)),
                   val = 1:30)

我正在尝试将其重新格式化为:

res <- data.frame(A = 1:10,
                  B = 11:20,
                  C = 21:30)

我怎样才能最轻松地完成这项工作?有小费吗。我知道这是一个很容易的&#34;问题,但我很难过。提前致谢。

3 个答案:

答案 0 :(得分:2)

请在发布前使用搜索功能。在SO!

上已经提到了很多

tidyverse你能做到:

data %>%
    group_by(id) %>%
    mutate(n = 1:n()) %>%
    ungroup() %>%
    spread(id, val) %>%
    select(-n)
## A tibble: 10 x 3
#       A     B     C
#   <int> <int> <int>
# 1     1    11    21
# 2     2    12    22
# 3     3    13    23
# 4     4    14    24
# 5     5    15    25
# 6     6    16    26
# 7     7    17    27
# 8     8    18    28
# 9     9    19    29
#10    10    20    30

评论:我建议逐行执行上述操作以查看每个命令的作用。另请注意

data %>%
    spread(id, val)

会产生错误(请参阅评论中的@ neilfws&#39;解释)。

答案 1 :(得分:0)

#define ALL_ACCELS_MASK (GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK) gdk_keymap_translate_keyboard_state (keymap, event->hardware_keycode, event->state, event->group, &keyval, NULL, NULL, &consumed); if (keyval == GDK_PLUS && (event->state & ~consumed & ALL_ACCELS_MASK) == GDK_CONTROL_MASK) // Control was pressed 包是tidyrreshape包的replacement

因此,reshape2函数,tidyrspread()分别是gather()reshape2::cast()的替代品。

要按要求传播数据,您需要添加另一列以指定输出数据框中的行号,如下所示。

reshape2::melt()

...和输出:

data <- data.frame(id = c(rep("A", 10), rep("B", 10), rep("C", 10)),
                   val = 1:30,row=c(1:10,1:10,1:10))

library(tidyr)
data %>% spread(.,id,val)

要删除> data %>% spread(.,id,val) row A B C 1 1 1 11 21 2 2 2 12 22 3 3 3 13 23 4 4 4 14 24 5 5 5 15 25 6 6 6 16 26 7 7 7 17 27 8 8 8 18 28 9 9 9 19 29 10 10 10 20 30 > 变量,请将row包和dplyr添加到不需要的列中。

select()

...和输出:

library(tidyr)
library(dplyr)
data %>% spread(.,id,val) %>% select(-row)

答案 2 :(得分:0)

所有这些功能从根本上做同样的事情 - 它们将数据集从宽格式转换为长格式,反之亦然。差异在于 他们如何处理任务。

reshape函数是基本R方法 - 它永远存在。我发现它很麻烦(我需要每次都检查一下这些例子才能使用它),但是它非常实用。

如果您从宽格式开始,那么使用长格式的简单示例如下所示:

df_long <- reshape(df_wide,
  direction = "wide",
  ids = 1:nrow(df_wide), # required, but not very informative
  times = colnames(df_wide), # required - the factor labels for the variable differentiating a measurement from column 2 versus column 3,
  varying = 1:ncol(df_wide) # required - specify which columns need to be switched to long format.
  v.names = "measurement", # optional - the name for the variable which will contain all the values of the variables being converted to long format
  timevar = "times" # optional - the name for the variable containing the factor (with levels defined in the times argument.)
)

您可以类似地通过长格式(direction ='long') - 设置direction = wide,并且必需的参数变为可选参数,以及可选参数(timevar,{{1} }和idvar)成为必需。 (从理论上讲,R有时可以推断出一些变量,但我从来没有好运。我会根据需要对它们进行处理。无论它们是否存在。

v.names / gather函数是一种更简单的替代方法。一个很大的区别:它是两个命令而不是一个,因此您不必担心哪些参数与每个参数相关。我看到至少有2个答案已经出现,描述了这些功能是如何工作的,所以我不会重复他们所说的话。