【问题标题】:How to spread data and combine into same row by same id in r如何在r中通过相同的ID传播数据并组合到同一行
【发布时间】:2019-09-09 05:03:09
【问题描述】:

我有一个数据是这样的:

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" 列并将同一组(基于时间和位置)的"count" 合并到同一行中,如下所示:

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) %>%
  spread(Type, count)

他们都没有工作。任何帮助表示赞赏。谢谢。

【问题讨论】:

  • 您好,很抱歉打错了 - 级别重复了,但它们应该是相同的级别,A、B 和 C 的计数不同。而且我已经更改了日期。
  • @Mauritz 我想我现在看到了问题;目标是获取Type 变量的count 值以绘制相关图。也许我可以删除其他列。您能否告诉我如何在 r 中做到这一点?
  • @Maurits 抱歉,这有点令人困惑,但我认为两者兼而有之:我必须按 (Time, location) 对它们进行分组,在这种情况下,我每个 Time 都有一个观察结果、locationType,然后根据Type组合成一行。

标签: r data-cleaning


【解决方案1】:

进一步上面cmets中的讨论,你的意思是这样的吗?

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)

【讨论】:

  • 这是我想要的,但不知何故,我仍然得到与以前使用我的数据相同的输出:/
  • @Harper 我建议逐步阅读我给出的代码示例。这样你就可以准确地看到每一步的作用。我已经包含了您提供的示例数据,因此这是完全可重现的。可能是您有不同的列名,因此您可能需要对更大的数据进行一些调整。
  • 我认为这是因为 excel 中的时间是日期时间而不是日期。感谢您的帮助。我会努力解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多