首页 > 解决方案 > purrr 迭代或循环所有列(类似于计算和求和或减去变量的函数)

问题描述

我想在这里找到一些见解来解决一个非常实际的问题。假设我有两个时间点(w0 和 w1),我想减去(或求和)所有特定的配对值。在时间 1 测量 1,在时间 2 测量 1,在时间 1 测量 2,在时间 2 测量 2。

我更熟悉 tidyverse 环境(需要 purrr),这就是我必须模拟真实数据集的代码

任何狩猎都需要。谢谢

library(tidyverse)
ds <- data.frame(w0_1=rnorm(10,1,2),
                 w0_2=rnorm(10,3,3),
                 w0_3=rnorm(10,3,2),
                 w1_1=rnorm(10,2,1),
                 w1_2=rnorm(10,3,3),
                 w1_3=rnorm(10,5,4))


ds %>% 
  summarise(dif_1 = mean(w0_1, na.rm=T)-mean(w1_1, na.rm=T))

ds %>% 
  summarise(dif_2 = mean(w0_2, na.rm=T)-mean(w1_2, na.rm=T))

顺便说一句,我知道下面的代码不起作用,但这就是我的问题背后的理由

for (i in 1:3) {
  ds %>% 
    summarise(dif_1 = mean(w0_[[i]], na.rm=T)-mean(w1_[[i]], na.rm=T))
}

标签: rloopstidyversepurrr

解决方案


使用@fmarm 的数据,这是一个不整洁的方法:

(ds.mean <- colMeans(ds, na.rm=TRUE))
#   w0_1  w0_2  w0_3  w1_1  w1_2  w1_3 
#  1.264 3.747 2.733 2.121 3.402 5.574 
(ds.diff <- ds.mean[paste0("w0_", 1:3)] - ds.mean[paste0("w1_", 1:3)])
#     w0_1    w0_2    w0_3 
#  -0.8563  0.3441 -2.8412 

如果已知 w0 的数量(在本例中为 3),则更简单:

(ds.diff <- ds.mean[1:3] - ds.mean[4:6])
#    w0_1    w0_2    w0_3 
# -0.8563  0.3441 -2.8412

推荐阅读