【问题标题】:count NAs for every participant long format计算每个参与者长格式的 NA
【发布时间】:2020-06-12 17:50:48
【问题描述】:

我有一个长格式的数据框,每个参与者有 90 行。现在我想排除在某些特定列中具有超过 10 个 NA 的每个参与者。例如,如果在称为 rating1 的列中有超过 10 个 NA,或者在 rating 2 中有超过 10 个 NA。

我认为我必须使用 for 循环来解决这个问题。但我不知道怎么做。所以我想检查前 90 行并检查是否有超过 10 个 NA,然后检查接下来的 90 行等等,并将这些案例的 id 保存在某处,以便我可以排除它们。 是否清楚我要达到的目标?

我试过了,至少得到了前 90 个的总和

colSums(is.na(dato[1:90,]))

【问题讨论】:

  • 您能否澄清一下您要根据一个特定列或许多列中的任何一列中的 10 个 NAs 排除?

标签: r count


【解决方案1】:

澄清后,这是dplyr的方法:

请注意,everything() 不包括 group_by 列。

data %>%
  group_by(Participant) %>% 
  filter(all(colSums(across(everything(), is.na)) <= 10))

这里是一些示例数据:

set.seed(3)
data <- data.frame(Participant = rep(1:10, each = 90), setNames(as.data.frame(replicate(20, sample(c(NA,1:13),size = 900, replace = TRUE))),paste0("rating",1:20)))

data %>% group_by(Participant) %>% summarize(S = list(colSums(across(everything(),is.na)))) %>% unnest_wider("S")
# A tibble: 10 x 21
   Participant rating1 rating2 rating3 rating4 rating5 rating6 rating7 rating8 rating9 rating10 rating11 rating12 rating13 rating14 rating15
         <int>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
 1           1       5       4       5       6       8       6       3       7       7        5        4        5        4       10        6
 2           2       5      13      12       4       8       4       6       7      10       10        9        8        7        3        7
 3           3       5       7       8       6      10       6       4       7       6        9        7       10        6       12        6
 4           4      10       7       7       3       3       8       6       5       5        5        6        3        5       11       14
 5           5       5       7       4       5       9       4       5       3       4        7        5        4        6        3        5
 6           6       4       3       2       4       5       4       4       5       6        6        7        7        5        8        6
 7           7      11       7       6       5      11      11       4      10       6        7        7        7        5        4        9
 8           8      11       6      11       5       4       5      12       5       5        5        8        1       12        8        4
 9           9       3       5       3       8       6       8       5       8       4        6        8        6        6        5        8
10          10       4       3       9       6       7       6       5       6      10        7        6        7        9        5        6
# … with 5 more variables: rating16 <dbl>, rating17 <dbl>, rating18 <dbl>, rating19 <dbl>, rating20 <dbl>

【讨论】:

  • 我试过了,想在 datnew 中保存没有这些情况的数据。所以我把 datnew 像这样 datnew %...跨度>
  • 查看我的编辑以在超过 10 个NAs 的任何结果列的 20 个结果列中过滤 out
  • 非常感谢!我可以再问你一个问题,看看我的逻辑是否正确?如果我有另一个排除标准,即每个平均 RT > 2000 的参与者都应该被排除,我可以写:data &lt;- data %&gt;% group_by(participant) %&gt;% filter(mean(RT) &lt;= 2000)
  • 应该可以。听起来你已经想通了。虽然你可能需要mean(RT, na.rm = TRUE)
【解决方案2】:

使用is.na.data.frame

df <- data.frame(col1 = c(1:3, NA),
                 col2 = c("this", NA,"is", "text"), 
                 col3 = c(TRUE, FALSE, TRUE, TRUE), 
                 col4 = c(2.5, 4.2, 3.2, NA))

is.na.data.frame(df)

      col1  col2  col3  col4
[1,] FALSE FALSE FALSE FALSE
[2,] FALSE  TRUE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE
[4,]  TRUE FALSE FALSE  TRUE

rowSums(is.na.data.frame(df))

[1] 0 1 0 2


【讨论】:

  • 但这只会计算整个数据框列中的 NA,对吧?不被参与者分开
  • 0 代表第一行(参与者)、1 秒、0 第三、2 第四等......所以我会说这是参与者。不像 dplyr 那样冗长,但可以完成这项工作
  • 好的,感谢您的澄清。我想我更喜欢 dplyr 解决方案。但无论如何,我也非常感谢你的想法。非常感谢
猜你喜欢
  • 1970-01-01
  • 2016-10-19
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 2021-11-25
相关资源
最近更新 更多