【问题标题】:Data transformation: spread categorical data frame to counts R数据转换:将分类数据帧传播到计数 R
【发布时间】:2021-05-14 16:59:34
【问题描述】:

我正在尝试将具有多个分类变量的数据框转换为频率计数。

数据如下所示:

Site  Date          ID  X1      X2      X3
A     June - 01/16  1   aware   resting resting
B     June - 03/16  2   aware   feeding feeding
C     June - 01/16  1   resting aware   aware

我想把它变成这样的东西:

site   date           ID  aware   resting   feeding
A      June - 01/16   1   3       2         1 
B      June - 01/16   2   1       0         2 

我尝试使用 dplyr,但未能选择所有我想要的变量(X1、X2 和 X3)

data_frame %>% 
  dplyr::count((data_frame[c(1:3)]),cbind(data_frame[c(4:6)])) %>% 
  tidyr::spread(key = (data_frame[c(4:6)]),value = n)

这是我的数据示例:

data_frame <- structure(data.frame(site = c("A", "B", "C", "A", "B", "C", "D"), 
date = c("June - 01/16","June - 03/16", "June - 01/16", "June - 01/16", "June - 03/16", "June - 03/16", "June - 03/16"), 
ID = c("1", "2", "1", "3", "1", "2", "3"), 
X1= c("aware", "aware","resting","feeding","aware", "resting","feeding"),
X2 = c("resting","feeding","aware","na","na","aware","resting"),
X3 = c("resting","feeding","aware", "aware","resting","feeding","aware")))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以重新整形为“长”格式,根据列获取count,然后使用pivot_wider重新整形为“宽”

    library(dplyr)
    library(tidyr)
    data_frame %>% 
       pivot_longer(cols = X1:X3) %>% 
       select(-name) %>%
       count(site, date, ID, value) %>% 
       pivot_wider(names_from = value, values_from = n, values_fill = 0)
    

    或者我们可以使用values_fn

    data_frame %>% 
       pivot_longer(cols = X1:X3) %>% 
       select(-name) %>%       
       pivot_wider(names_from = value, values_from = n, values_fill = 0,
            values_fn = length)
    

    【讨论】:

    • 谢谢阿克伦。你能检查我的代码并告诉我为什么得到 NA 吗?
    【解决方案2】:

    更新:在 akrun 的帮助下,这里是带有 add_count 的代码

    data_frame %>%    
      pivot_longer(cols = c(X1, X2, X3)) %>%    
      add_count(value) %>% select(-name) %>% 
      distinct %>%  
      pivot_wider(names_from = "value", values_from = n, values_fill = 0)  
    

    输出:

      site  date         ID    aware resting feeding    na
      <chr> <chr>        <chr> <int>   <int>   <int> <int>
    1 A     June - 01/16 1         8       6       0     0
    2 B     June - 03/16 2         8       0       5     0
    3 C     June - 01/16 1         8       6       0     0
    4 A     June - 01/16 3         8       0       5     2
    5 B     June - 03/16 1         8       6       0     2
    6 C     June - 03/16 2         8       6       5     0
    7 D     June - 03/16 3         8       6       5     0
    

    【讨论】:

    • 可能你错过了values_fill = 0
    • 我相信add_count 正在创建计数列。您可能需要一个汇总列,即data_frame %&gt;% pivot_longer( cols = c(X1, X2, X3) ) %&gt;% add_count(value) %&gt;% select(-name) %&gt;% distinct %&gt;% pivot_wider(names_from = "value", values_from = n, values_fill = 0 )
    • @akrun。你真的是这里最棒的!非常感谢!
    猜你喜欢
    • 2019-01-16
    • 1970-01-01
    • 2022-06-11
    • 2020-10-30
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多