聚集,重塑,演员和类似功能有什么区别?我知道他们都有助于在长数据和宽数据之间进行转换,但我在使用它们时遇到了麻烦。文档倾向于使用" 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;问题,但我很难过。提前致谢。
答案 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
包是tidyr
和reshape
包的replacement。
因此,reshape2
函数,tidyr
和spread()
分别是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个答案已经出现,描述了这些功能是如何工作的,所以我不会重复他们所说的话。