【问题标题】:R - copy values from cells to empty cells within same columnsR - 将单元格中的值复制到同一列中的空单元格
【发布时间】:2021-03-03 04:21:35
【问题描述】:

我有一个数据集,其中包含李克特量表和反应时间的答案,这些都是实验操作的结果。理想情况下,我想复制 Likert_Answer 值并将它们与与该值相关的实验操作对齐。

数据集如下所示:

x <- rep(c(NA, round(runif(5, min=0, max=100), 2)), times=3)

myDF <- data.frame(ID = rep(c(1,2,3), each=6),
               Condition = rep(c("A","B"), each=3, times=3),
               Type_of_Task = rep(c("Test", rep(c("Experiment"), times=2)), times=6),
               Likert_Answer = c(5, NA, NA, 6, NA, NA, 1, NA, NA, 5, NA, NA, 5, NA, NA, 1, NA, NA),
               Reaction_Times = x)

我发现很难表述我遇到的问题,所以我的预期输出应该是这样的:

myDF_Output <- data.frame(ID = rep(c(1,2,3), each=6),
               Condition = rep(c("A","B"), each=3, times=3),
               Type_of_Task = rep(c("Test", rep(c("Experiment"), times=2)), times=6),
               Likert_Answer = rep(c(5, 6, 1, 5, 5, 1), each = 3),
               Reaction_Times = x)

我在this post 看到了一个可行的解决方案,如下:

library(dplyr)
library(tidyr)

myDF2 <- myDF %>% 
  group_by(ID) %>% 
  fill(Likert_Answer) %>% 
  fill(Likert_Answer, .direction = "up")

问题在于,只要一个人回答李克特量表,这个解决方案就有效。如果不是这样,恐怕这个解决方案会“拖累”前一个实验条件的李克特量表的结果。例如:

myDF_missing <- myDF
myDF_missing[4,4] = NA

myDF3 <- myDF_missing %>% 
  group_by(ID) %>% 
  fill(Likert_Answer) %>% 
  fill(Likert_Answer, .direction = "up")

在这种情况下,对于 ID 1 的条件 B 中的所有值,Likert_Scales 中本应为 NA 的值已变为 5。知道如何避免这种情况吗?

(如果代码很脏,请原谅:我对 R 很陌生,而且我正在努力学习......但在这个阶段我被这个问题困住了。)

【问题讨论】:

    标签: r copy cell replicate


    【解决方案1】:

    如果我正确理解了您的问题,那么您就非常接近解决方案了。我操纵了演示 df 来展示分组的工作原理:

    library(dplyr)
    library(tidyr)
    
    myDF <- data.frame(ID = rep(c(1,2,3), each=6),
                       Condition = rep(c("A","B"), each=3, times=3),
                       Type_of_Task = rep(c("Test", rep(c("Experiment"), times=5)), times=3),
                       Likert_Answer = c(5, NA, NA, 6, NA, NA, 1, NA, NA, 5, NA, NA, NA, NA, NA, 1, NA, NA),
                       Reaction_Times = x)
    
    
    myDF %>% 
      dplyr::group_by(ID) %>% 
      tidyr::fill(Likert_Answer)
    
          ID Condition Type_of_Task Likert_Answer Reaction_Times
       <dbl> <chr>     <chr>                <dbl>          <dbl>
     1     1 A         Test                     5           NA  
     2     1 A         Experiment               5           18.4
     3     1 A         Experiment               5           41.1
     4     1 B         Experiment               6           59.8
     5     1 B         Experiment               6           93.4
     6     1 B         Experiment               6           38.5
     7     2 A         Test                     1           NA  
     8     2 A         Experiment               1           18.4
     9     2 A         Experiment               1           41.1
    10     2 B         Experiment               5           59.8
    11     2 B         Experiment               5           93.4
    12     2 B         Experiment               5           38.5
    13     3 A         Test                    NA           NA  
    14     3 A         Experiment              NA           18.4
    15     3 A         Experiment              NA           41.1
    16     3 B         Experiment               1           59.8
    17     3 B         Experiment               1           93.4
    18     3 B         Experiment               1           38.5
    

    【讨论】:

    • 通过您的回复,我才意识到我在代码中做错了一些事情来解释我的问题! Type_of_Task 中与条件 B 对应的第一个单元格应该是“测试”而不是“实验”。我会编辑并尽量让自己清楚。很抱歉!
    • 我现在修复了代码并编辑了问题。我希望现在我的问题更清楚了。基本上,我希望为相同的 ID 填充列中的值,但也为相同的条件填充。这样,如果参与者 ID1 没有回答条件 B 的李克特量表,则该结果仍然是 NA,并且不会填充条件 A 的测试结果。
    • @Lucas:你必须使用两个变量进行分组:myDF_missing %>% dplyr::group_by(ID, Condition) %>% tidyr::fill(Likert_Answer)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    相关资源
    最近更新 更多