【问题标题】:R: Calculate the column medians by grouping the ID'sR:通过对 ID 进行分组来计算列中位数
【发布时间】:2015-05-08 21:33:38
【问题描述】:

从我之前的post 继续,现在我想按 ID 分组(仅适用于第 3 列)并计算列的中值(Point_B),然后用列中的每个值减去中值(Point_B)到其各自的组。 NA 仍应退回。

注意:我希望 ID 分组仅应用于 Point_B 列,而不是 Point_A,因为我想计算整个 Point_A 列的中值并用 Point_A 中的值减去它。

例如

ID <- c("A","A","A","B","B","B","C","C","C") 
Point_A <- c(1,2,NA,1,2,3,1,2,NA) 
Point_B <- c(1,2,3,NA,NA,1,1,1,3)

df <- data.frame(ID,Point_A ,Point_B)


+----+---------+---------+
| ID | Point_A | Point_B |
+----+---------+---------+
| A  | 1       | 1       |
| A  | 2       | 2       |
| A  | NA      | 3       |
| B  | 1       | NA      |
| B  | 2       | NA      |
| B  | 3       | 1       |
| C  | 1       | 1       |
| C  | 2       | 1       |
| C  | NA      | 3       |
+----+---------+---------+

在我之前的帖子中提供的解决方案是在不按 ID 分组的情况下计算中位数。这里是

library(dplyr)
 df %>%
     mutate_each(funs(median=.-median(., na.rm=TRUE)), -ID)

期望的输出

+----+---------+---------+
| ID | Point_A | Point_B |
+----+---------+---------+
| A  | -1      | -1      |
| A  | 0       | 0       |
| A  | NA      | 1       |
| B  | -1      | NA      |
| B  | 0       | NA      |
| B  | 1       | 0       |
| C  | -1      | 0       |
| C  | 0       | 0       |
| C  | NA      | 2       |
+----+---------+---------+

如何通过 ID 分组获取 Column3 中的值?

【问题讨论】:

    标签: r dplyr na median


    【解决方案1】:

    我猜你会想要一个group_by(遵循@docendodiscimus 的建议):

    demed <- function(x) x-median(x,na.rm=TRUE)
    
    df %>% 
      mutate_each(funs(demed),Point_A) %>%
      group_by(ID) %>%  
      mutate_each(funs(demed),Point_B)
    

    给予

      ID Point_A Point_B
    1  A      -1      -1
    2  A       0       0
    3  A      NA       1
    4  B      -1      NA
    5  B       0      NA
    6  B       1       0
    7  C      -1       0
    8  C       0       0
    9  C      NA       2
    

    我更喜欢类似的data.table 代码。它的语法需要多次写入变量名,但括号要少得多:

    require(data.table)
    DT <- data.table(df)
    
    DT[,Point_A:=demed(Point_A)
    ][,Point_B:=demed(Point_B)
    ,by=ID]
    

    【讨论】:

    • 弗兰克,感谢您的建议,但我想要的输出有点不同。我已经在上面展示了。我需要取中位数并减去列中的每个值。你能检查一下吗?
    • @Sharath 你必须在管道之前定义你的 de-median 函数,但这可以用相当好的语法完成工作。
    • 出色的工作。我得到了你的新编辑的结果。非常感谢。我将它应用到一个更大的数据集,它就像魅力一样。
    • IMO,dplyr 方法应该是df %&gt;% mutate(Point_A = demed(Point_A)) %&gt;% group_by(ID) %&gt;% mutate(Point_B = demed(Point_B))
    • 如果您更喜欢在这种情况下使用mutate_each,我会稍作调整以使其更清晰:mutate_each(funs(demed),Point_A)
    猜你喜欢
    • 2018-03-21
    • 2022-11-25
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    相关资源
    最近更新 更多