【问题标题】:wrangling data using r使用 r 整理数据
【发布时间】:2020-12-29 16:28:31
【问题描述】:

在使用 R 整理数据时,我需要您的帮助。

我的原始数据是这样的:

   > dput(mydata)
structure(list(subject = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L), .Label = c("N1", "E1"), class = "factor"), item_number = c(1, 
2, 1, 7, 1, 2, 2, 10), block = c(1, 1, 3, 3, 1, 1, 3, 3), condition = c("L", 
"L", "EI", "I", "L", "L", "EI", "I")), row.names = c(NA, 8L), class = "data.frame")

 > mydata
  subject item_number block condition
1      N1           1     1         L
2      N1           2     1         L
3      N1           1     3        EI
4      N1           7     3         I
5      E1           1     1         L
6      E1           2     1         L
7      E1           2     3        EI
8      E1          10     3         I

对于某些编程错误,我无法正确标记块 1 中的条件。所以,我试图通过为不同的主题和不同的项目编号重命名块 1 中的条件来调整它。理想情况下,块 1 中任何被赋予值 L 的 item_number 都应该根据在块 3 中赋予相同 item_number 的条件标签重命名。例如,对于主题 N1,如果 item_number 1 存在于块 3 中并且是给定条件标签 EI,则块 1 中 item_number 1 的条件标签应设置为与“EI”相同的标签。如果主题 N1 的块 3 中不存在 item_number 2,则块 1 中的项目编号 2 的条件标签应为“E”。

所需的输出应如下所示:

dput(mydata_cleaned)
structure(list(subject = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L), .Label = c("N1", "E1"), class = "factor"), item_number = c(1, 
2, 1, 7, 1, 2, 2, 10), block = c(1, 1, 3, 3, 1, 1, 3, 3), condition = c("EI", 
"E", "EI", "I", "E", "EI", "EI", "I")), row.names = c(NA, 8L), class = "data.frame")
> mydata_cleaned
  subject item_number block condition
1      N1           1     1        EI
2      N1           2     1         E
3      N1           1     3        EI
4      N1           7     3         I
5      E1           1     1         E
6      E1           2     1        EI
7      E1           2     3        EI
8      E1          10     3         I

非常感谢任何帮助。

【问题讨论】:

    标签: r dplyr data-wrangling


    【解决方案1】:

    一种选择是使用从“块”创建的列名重新整形为“宽”格式,然后根据3 的值对列1 进行替换,然后重新整形为“长”格式

    library(dplyr)
    library(tidyr)
    mydata %>%
     pivot_wider(names_from = block, values_from = condition) %>% 
     mutate(`1` = case_when(`3` %in% "EI" & `1` %in% "L"  ~ `3`, 
           is.na(`3`) ~ 'E', TRUE ~ `1`)) %>%
     pivot_longer(cols = c(`1`, `3`), names_to = 'block',
              values_to = 'condition', values_drop_na = TRUE)
    

    -输出

    # A tibble: 8 x 4
    #  subject item_number block condition
    #  <fct>         <dbl> <chr> <chr>    
    #1 N1                1 1     EI       
    #2 N1                1 3     EI       
    #3 N1                2 1     E        
    #4 N1                7 3     I        
    #5 E1                1 1     E        
    #6 E1                2 1     EI       
    #7 E1                2 3     EI       
    #8 E1               10 3     I       
    

    【讨论】:

    • 非常感谢您的帮助和代码@akrun。虽然代码对主题 N1 工作得很好,但不幸的是,它没有为主题 E1 捕获正确的标签。例如,item_number 2 应该在第 1 块中标记为 EI。再次感谢您的宝贵时间。
    • @azizitamimi 你的条件是 'item_number' 2 和块 3 没有 item_number 2 的情况
    • @azizitamimi 'block 1' 改成 'EI' 怎么样
    • 嗨@akrun,我很抱歉造成混乱并且未能将我的问题说得很清楚。实际上,这应该适用于任何项目编号(不仅是项目编号 2)。因此,想法是块 1 中的任何项目编号都应该收到分配给块 3 中相同项目编号的相同条件标签。如果块 1 中的项目编号没有出现在块 3 中;那么在block1的条件下,相同的项目编号应该被赋予标签E。再次为您的困惑感到抱歉。
    • 这太棒了,它很好地解决了我的问题。非常感谢 akrun 提供了如此智能的解决方案和非常高效的代码。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2020-06-11
    • 2023-03-06
    相关资源
    最近更新 更多