如何在r中以相同的id传播数据并合并到同一行
我有一个类似这样的数据:如何在r中以相同的id传播数据并合并到同一行,r,data-cleaning,R,Data Cleaning,我有一个类似这样的数据: Id Time Type location count no_activities id 1 2014/10/11 A level1 20 10 1 2 2014/10/11 B level1 20 10 2 3 2014/10/11 C level1 10 9 3 4 2014/10
Id Time Type location count no_activities id
1 2014/10/11 A level1 20 10 1
2 2014/10/11 B level1 20 10 2
3 2014/10/11 C level1 10 9 3
4 2014/10/11 A level2 5 12 4
5 2014/10/11 B level2 6 5 5
6 2014/10/11 C level2 7 8 6
7 2014/10/11 A level3 7 8 7
8 2014/10/11 B level3 9 5 8
9 2014/10/11 C level3 20 23 9
...
...
Time Type location count no_activities id
101 2014/11/27 A level33 20 10 101
102 2014/11/27 B level33 30 10 102
103 2014/11/27 C level33 10 9 103
104 2014/11/27 A level34 10 12 104
105 2014/11/27 B level34 16 5 105
106 2014/11/27 C level34 5 8 106
107 2014/11/27 A level35 3 8 107
108 2014/11/27 B level35 1 5 108
109 2014/11/27 C level35 10 23 109
在按日期和位置对它们进行分组后,我希望将Type列展开,并根据时间和位置将相同组的计数合并到同一行中,如下所示:
Id Time location A B C
1 2014/10/11 level1 20 20 10
4 2014/10/11 level2 5 6 7
7 2014/10/11 level3 7 9 20
10 2014/10/11 level4 ...
13 2014/10/11 level5 ...
16 2014/10/11 level6
19 2014/10/11 level7
22 2014/10/11 level8
25 2014/10/11 level9
...
我读过一些类似的问题,但在这种情况下,似乎没有一个能解决我的问题。我尝试了以下代码:
df %>% dplyr::group_by(Time, location) %>% summarise_all(funs(toString(na.omit(.))))
它设法按日期和级别对观察结果进行分组,但将列中缺失的内容替换为NA,而不是合并
将相同时间和级别的行合并为一行:
Id Time location count no_activities id A B C
1 2014/10/11 level1 20 10 1 20 NA NA
2 2014/10/11 level1 20 10 2 NA 20 NA
3 2014/10/11 level1 10 9 3 NA NA 10
4 2014/10/11 level2 5 12 4 5 NA NA
5 2014/10/11 level2 6 5 5 NA 6 NA
6 2014/10/11 level2 7 8 6 NA NA 7
7 2014/10/11 level3 7 8 7 7 NA NA
8 2014/10/11 level3 9 5 8 NA 9 NA
9 2014/10/11 level3 20 23 9 NA NA 20
...
我也试过了
df %>% reshape(df, v.names= c("A", "B", "C"), idvar=Id, timevar ="Time", direction="wide")
及
他们都没有工作。感谢您的帮助。谢谢。除了上面评论中的讨论,你是指这样的事情吗
df %>%
group_by(Time, location) %>%
select(Time, location, Type, count) %>%
spread(Type, count) %>%
ungroup()
## A tibble: 6 x 5
# Time location A B C
# <fct> <fct> <int> <int> <int>
#1 2014/10/11 level1 20 20 10
#2 2014/10/11 level2 5 6 7
#3 2014/10/11 level3 7 9 20
#4 2014/11/27 level33 20 30 10
#5 2014/11/27 level34 10 16 5
#6 2014/11/27 level35 3 1 10
样本数据
您好,很抱歉有一个输入错误-这些级别重复了,但它们应该是相同级别,a、B和C的计数不同。我已经更改了日期。@Mauritz我想我现在看到了问题;目标是获取类型变量的计数值,以绘制相关图。也许我可以删除其他列。你能告诉我如何在r中做到这一点吗?@Maurits很抱歉这有点混乱,但我认为两者都有:我必须按时间、地点对它们进行分组,在这种情况下,我每次、地点和类型都有一个观察结果,然后根据类型将它们组合成一行。这是我想要的,但不知何故,我仍然获得了与之前使用数据相同的输出:/@Harper我建议逐步阅读我给出的代码示例。这样你就可以清楚地看到每一步的作用。我已经包括了你提供的样本数据,所以这是完全可复制的。可能是因为您有不同的列名,所以您可能需要对较大的数据进行一些调整。我认为这是因为excel中的时间是以日期时间为单位的,而不仅仅是日期。谢谢你的帮助。我会设法解决的。
df %>%
group_by(Time, location) %>%
select(Time, location, Type, count) %>%
spread(Type, count) %>%
ungroup()
## A tibble: 6 x 5
# Time location A B C
# <fct> <fct> <int> <int> <int>
#1 2014/10/11 level1 20 20 10
#2 2014/10/11 level2 5 6 7
#3 2014/10/11 level3 7 9 20
#4 2014/11/27 level33 20 30 10
#5 2014/11/27 level34 10 16 5
#6 2014/11/27 level35 3 1 10
df <- read.table(text =
"Id Time Type location count no_activities id
1 '2014/10/11' A level1 20 10 1
2 '2014/10/11' B level1 20 10 2
3 '2014/10/11' C level1 10 9 3
4 '2014/10/11' A level2 5 12 4
5 '2014/10/11' B level2 6 5 5
6 '2014/10/11' C level2 7 8 6
7 '2014/10/11' A level3 7 8 7
8 '2014/10/11' B level3 9 5 8
9 '2014/10/11' C level3 20 23 9
101 '2014/11/27' A level33 20 10 101
102 '2014/11/27' B level33 30 10 102
103 '2014/11/27' C level33 10 9 103
104 '2014/11/27' A level34 10 12 104
105 '2014/11/27' B level34 16 5 105
106 '2014/11/27' C level34 5 8 106
107 '2014/11/27' A level35 3 8 107
108 '2014/11/27' B level35 1 5 108
109 '2014/11/27' C level35 10 23 109", header = T)