我正在尝试使用dplyr处理一个(相当大的)数据集,我相信我的问题源于对"summarise_if“函数的一些错误使用。下面是一些代码,用于生成与我的数据类似的虚拟数据:
df <- data.frame(Block = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4),
Treatment = c(rep("Control", 4), rep("CF", 4), rep("LR", 4)),
var1 = c(9, 12, 15, 16, 11, 9, 13, 11, 5, 11, 5, 11),
var2 = c(0, 4, 9, 3, 6, 0, 0, 10, 15, 25, 0, 0))我希望按块和处理对数据进行分组,然后,对于每个变量(var1、var2、.),我希望将“处理”值除以每个块的"control“值。生成的数据框架如下所示(我还没有对我的虚拟数据做过所有的计算,所以我只是给出了在每个单元格中应该计算什么的示例公式):
Treatment Block var1 var2
CF 1 CF/control CF/control
CF 2 CF/control CF/control
CF 3 CF/control CF/control
CF 4 CF/control CF/control
LR 1 LR/control LR/control
LR 2 LR/control LR/control
LR 3 LR/control LR/control
LR 4 LR/control LR/control其中一些值将是NaN或无穷大,因为对于某些处理,我将除以零,但没关系。
我能够一次使用以下代码为单变量和治疗生成所需的内容:
df %>%
dplyr::group_by(Block) %>%
dplyr::summarise(value = var1[Treatment=="CF"] / var1[Treatment=="Control"])但是,这在许多变量和治疗上变得单调乏味。但是,当我尝试对整个数据帧执行此操作时,会遇到各种各样的错误。我的猜测是这样的:
df %>%
dplyr::group_by(Block, Treatment) %>%
dplyr::summarise_if(is.numeric, value = .[Treatment=="CF"] / .[Treatment=="Control"])这给了我错误的“对象‘待遇’没有找到”,也迫使我去治疗-通过治疗。
任何帮助都是非常感谢的!
发布于 2020-11-27 03:35:49
您可以使用以下内容:
df %>%
dplyr::group_by(Block) %>%
dplyr::summarise(across(where(is.numeric),
list(CF = ~.[Treatment=="CF"] / .[Treatment=="Control"],
LR = ~.[Treatment=="LR"] / .[Treatment=="Control"])))
# Block var1_CF var1_LR var2_CF var2_LR
# <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1 1.22 0.556 Inf Inf
#2 2 0.75 0.917 0 6.25
#3 3 0.867 0.333 0 0
#4 4 0.688 0.688 3.33 0 如果希望输出遵循预期输出中所示的相同格式,则可以使用pivot_longer。
df %>%
dplyr::group_by(Block) %>%
dplyr::summarise(across(where(is.numeric),
list(CF = ~.[Treatment=="CF"] / .[Treatment=="Control"],
LR = ~.[Treatment=="LR"] / .[Treatment=="Control"]))) %>%
tidyr::pivot_longer(cols = -Block,
names_to = c('.value', 'Treatment'),
names_sep = '_')
# Block Treatment var1 var2
# <dbl> <chr> <dbl> <dbl>
#1 1 CF 1.22 Inf
#2 1 LR 0.556 Inf
#3 2 CF 0.75 0
#4 2 LR 0.917 6.25
#5 3 CF 0.867 0
#6 3 LR 0.333 0
#7 4 CF 0.688 3.33
#8 4 LR 0.688 0 https://stackoverflow.com/questions/65031743
复制相似问题