首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用dplyr和tidyr将行划分为一行

使用dplyr和tidyr将行划分为一行
EN

Stack Overflow用户
提问于 2020-11-27 03:29:17
回答 1查看 68关注 0票数 1

我正在尝试使用dplyr处理一个(相当大的)数据集,我相信我的问题源于对"summarise_if“函数的一些错误使用。下面是一些代码,用于生成与我的数据类似的虚拟数据:

代码语言:javascript
运行
复制
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“值。生成的数据框架如下所示(我还没有对我的虚拟数据做过所有的计算,所以我只是给出了在每个单元格中应该计算什么的示例公式):

代码语言:javascript
运行
复制
    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或无穷大,因为对于某些处理,我将除以零,但没关系。

我能够一次使用以下代码为单变量和治疗生成所需的内容:

代码语言:javascript
运行
复制
df %>% 
  dplyr::group_by(Block) %>%
  dplyr::summarise(value = var1[Treatment=="CF"] / var1[Treatment=="Control"])

但是,这在许多变量和治疗上变得单调乏味。但是,当我尝试对整个数据帧执行此操作时,会遇到各种各样的错误。我的猜测是这样的:

代码语言:javascript
运行
复制
df %>% 
  dplyr::group_by(Block, Treatment) %>%
  dplyr::summarise_if(is.numeric, value = .[Treatment=="CF"] / .[Treatment=="Control"])

这给了我错误的“对象‘待遇’没有找到”,也迫使我去治疗-通过治疗。

任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-27 03:35:49

您可以使用以下内容:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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   
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65031743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档