【问题标题】:calculate descriptives for a nested variable计算嵌套变量的描述
【发布时间】:2020-08-08 12:28:25
【问题描述】:

我想计算一个变量的 M、最小值和最大值。在不同的访问中收集数据。我的数据如下所示:

id   visit     V1    
1     1        18
1     2        24
2     2        NA
2     3        5
2     4        6 

我希望它看起来像这样,其中我为每个参与者的 V1 设置了 M、SD、最小值和最大值列。

id   visit     V1    M      MIN    MAX
1     1        18    21     18     24      
2     2        3     4.67    3     6   

在计算 M 时,我想考虑访问次数(例如,18 + 24/2 次访问)。我尝试了这是第一步:

df %>%
  group_by(id) %>%
  mutate(M = mean(V1), MIN = min(V1), MAX = max(V1), na.rm = T)

当我尝试通过确保不包含 NA 来处理它们时,na.rm = T 会生成一个名为“na.rm”的新列,其中每个值都为真,这不是我想要的。对制作这项工作有什么想法吗?

【问题讨论】:

  • 您可以尝试df %>% group_by(id) %>% mutate(M=mean(V1),Min=min(V1),Max=max(V1))df 作为您的数据!

标签: r dataframe


【解决方案1】:

dplyr 包使这一切变得简单。您可以group_by() 一个变量,之后您所做的任何事情都只适用于组内。在dplyr 表示法中,%>% 是一个特殊的运算符,它将左侧函数的结果输入到右侧函数的第一个参数中。

有两种方法可以做到这一点。第一种方法保留所有数据,但您的汇总统计信息在每一行中重复。

library(dplyr)
df %>%
  group_by(id) %>%
  mutate(M = mean(V1), MIN = min(V1), MAX = max(V1)
id   visit     V1    M      MIN    MAX
1     1        18    21     18     24      
1     2        24    21     18     24
2     2        3     4.67    3     6
2     3        5     4.67    3     6
2     4        6     4.67    3     6

第二种方式只提供按组的汇总统计。

library(dplyr)
df %>%
  group_by(id) %>%
  summarize(M = mean(V1), MIN = min(V1), MAX = max(V1)
id   M      MIN    MAX
1    21     18     24      
2    4.67   3      6

【讨论】:

  • 嘿@Ben Norris。我决定使用您提供的第二段代码,因为我认为这更符合我的要求。但是,代码似乎为每个人提供了该特定变量的 M、MIN 和 MAX。您有修改建议吗?
  • 您可能需要向group_by 添加其他变量以获得更精细的统计信息
  • 啊,我明白了。谢谢!
  • R 似乎对 NA 感到窒息,并没有给我需要的描述。我修改了我的代码以反映您所做的(见上文),但添加了 na.rm = T,但这并没有起到作用。有什么建议吗?非常感谢您的帮助。 :)
  • 需要在每个函数中放入na.rm = TRUEmean(V1, na.rm = TRUE)
【解决方案2】:

您可以尝试这种类似于@ThomasIsCoding 的dplyr 方法,它会产生类似于您想要的东西:

library(dplyr)
#Data
df <- structure(list(id = c(1L, 1L, 2L, 2L, 2L), visit = c(1L, 2L, 
2L, 3L, 4L), V1 = c(18L, 24L, 3L, 5L, 6L)), class = "data.frame", row.names = c(NA, 
-5L))

代码:

df %>% group_by(id) %>% mutate(M=mean(V1),Min=min(V1),Max=max(V1),SD=sd(V1))

输出:

# A tibble: 5 x 7
# Groups:   id [2]
     id visit    V1     M   Min   Max    SD
  <int> <int> <int> <dbl> <int> <int> <dbl>
1     1     1    18 21       18    24  4.24
2     1     2    24 21       18    24  4.24
3     2     2     3  4.67     3     6  1.53
4     2     3     5  4.67     3     6  1.53
5     2     4     6  4.67     3     6  1.53

【讨论】:

  • @D.Fowler 太好了,它对你有帮助!!!给你很好的编码:)
【解决方案3】:

也许你想要像下面这样的东西

transform(df,
  M = ave(V1, id, FUN = mean),
  MIN = ave(V1, id, FUN = min),
  MAX = ave(V1, id, FUN = max)
)

给了

  id visit V1         M MIN MAX
1  1     1 18 21.000000  18  24
2  1     2 24 21.000000  18  24
3  2     2  3  4.666667   3   6
4  2     3  5  4.666667   3   6
5  2     4  6  4.666667   3   6

数据

> dput(df)
structure(list(id = c(1L, 1L, 2L, 2L, 2L), visit = c(1L, 2L, 
2L, 3L, 4L), V1 = c(18L, 24L, 3L, 5L, 6L)), class = "data.frame", row.names = c(NA,
-5L))

【讨论】:

    猜你喜欢
    • 2021-10-09
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    相关资源
    最近更新 更多