【问题标题】:Subtracting mean of certain rows using summarise_each使用 summarise_each 减去某些行的平均值
【发布时间】:2016-07-15 04:44:54
【问题描述】:

我有一个包含 30 个变量的数据集。其中一个是指示变量(0 或 1),我想减去某些列的标签为 1 的那些行的平均值(类似于居中,但取某些行的平均值而不是整列)。

Col2 Col3 Col4 label
400  322  345  1    
131  345  809  1     
565  676  311  0    
121  645  777  0    
322  534  263  0    
545  222  111  0    

对于上述数据集,我想对Col2:Col4进行如下操作:

x(i,j)-x'(,j)

其中x(i,j) 代表一个单元格,x'(,j) 代表label=1 所在列中行的平均值。例如,[3,1] 应该是

(565-mean(400,131))= 299.5

第 2 列的预期输出:

Col2
134.5
-134.5
299.5
-144.5
56.5
279.5

我一直在尝试使用summarise_each 命令,但直到现在都没有成功。我给出的命令是

try<- group_by(data,lbl) %>% select(c(4,13:26)) %>% summarise_each(funs((.)-(mean(data[data$lbl==1,])))

但这正在生成NA,我不确定我哪里出错了(我确定它在summarise_each 命令中,我无法弄清楚如何使用funs()正确)

感谢任何帮助。谢谢!

【问题讨论】:

  • 请阅读有关how to ask a good question 的信息以及如何提供reproducible example。这将使其他人更容易帮助您。
  • @ProcrastinatusMaximus 我已经编辑了这个问题,我希望这能让它更清楚。谢谢!
  • 您想要列的平均值,但没有 label == 1 的值?
  • @StevenBeaupré 不,对于每一列,我想减去 label==1 的行的平均值。
  • 所以列的总和(不包括 label == 1 的值)减去 label == 1 的值的平均值?请提供您的预期输出。

标签: r dplyr


【解决方案1】:
dat %>% 
  mutate_each(funs(. - mean(.[label==1])), -label)
    Col2   Col3 Col4 label
1  134.5  -11.5 -232     1
2 -134.5   11.5  232     1
3  299.5  342.5 -266     0
4 -144.5  311.5  200     0
5   56.5  200.5 -314     0
6  279.5 -111.5 -466     0

【讨论】:

  • 哇。触摸!非常聪明的方法。
【解决方案2】:

我会这样做:

sweep(df[1:3], 2, colMeans(df[df$label == 1,][1:3]))

这给出了:

#    Col2   Col3 Col4
#1  134.5  -11.5 -232
#2 -134.5   11.5  232
#3  299.5  342.5 -266
#4 -144.5  311.5  200
#5   56.5  200.5 -314
#6  279.5 -111.5 -466

另一种方法(诚然更复杂):

library(purrr)

df %>%
  by_row(function(x) {
    x[1:3] - df %>%
      filter(label == 1) %>%
      summarise_each(funs(mean), -label) },
    .collate = "cols",
    .labels = FALSE
  )

也许是最dplyr-esque 的方法(受此post 启发):

cm <- df %>%
  filter(label == 1) %>%
  summarise_each(funs(mean), -label) 

df %>% 
  mutate_each(funs(. - cm$. ), -label)

这给出了:

#    Col2   Col3 Col4 label
#1  134.5  -11.5 -232     1
#2 -134.5   11.5  232     1
#3  299.5  342.5 -266     0
#4 -144.5  311.5  200     0
#5   56.5  200.5 -314     0
#6  279.5 -111.5 -466     0

【讨论】:

    猜你喜欢
    • 2011-05-19
    • 2015-04-02
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    相关资源
    最近更新 更多