gpt4 book ai didi

r - tidyr::gather na.rm 缺少数据

转载 作者:行者123 更新时间:2023-12-04 10:27:11 33 4
gpt4 key购买 nike

假设我在一个数据框中有多个列来衡量相同的概念,但采用不同的方法(例如,有多种 IQ 测试,学生可以选择其中的任何一种,或者根本没有)。我想将各种方法组合到一个列中(tidyr 的明显用例)。

如果数据是这样的:

mydata <- data.frame(ID = 55:64, 
age = c(12, 12, 14, 11, 20, 10, 13, 15, 18, 17),
Test1 = c(100, 90, 88, 115, NA, NA, NA, NA, NA, NA),
Test2 = c(NA, NA, NA, NA, 100, 120, NA, NA, NA, NA),
Test3 = c( NA, NA, NA, NA, NA, NA, 110, NA, 85, 150))

我自然会想要执行这样的操作(请注意,我使用 na.rm = TRUE 是为了不让我的数据集中的许多 NA 获得它们自己的行):

library(tidyr)
tests <- gather(mydata, key=IQSource, value=IQValue, c(Test1, Test2, Test3), na.rm = TRUE)
tests

给我:

ID 年龄 IQSource IQValue
1 55 12 测试 1 100
2 56 12 测试 1 90
3 57 14 测试 1 88
4 58 11 测试 1 115
15 59 20 测试 2 100
16 60 10 测试 2 120
27 61 13 测试 3 110
29 63 18 测试 3 85
30 64 17 测试 3 150

问题是我有一个学生 (ID=62) 在这三个方面都没有 任何 IQ 分数,我不想丢失她的其他数据( ID 和年龄列中的数据)。

在 tidyr 中,有没有一种方法可以区分,是的,我想在我收集的至少一列中确实有数据的地方删除 NA,但同时又想在所有要收集的列是 NA?)

最佳答案

我没有找到直接的解决方案,但您可以right_join 返回原来的data.frame,然后取消选择您不需要的所有列。

library(tidyr)
library(dplyr)

mydata %>%
gather(key, val, Test1:Test3, na.rm = T) %>%
right_join(mydata) %>%
select(-contains("Test"))
#> Joining, by = c("ID", "age")
#> ID age key val
#> 1 55 12 Test1 100
#> 2 56 12 Test1 90
#> 3 57 14 Test1 88
#> 4 58 11 Test1 115
#> 5 59 20 Test2 100
#> 6 60 10 Test2 120
#> 7 61 13 Test3 110
#> 8 62 15 <NA> NA
#> 9 63 18 Test3 85
#> 10 64 17 Test3 150

或者,您当然可以先创建一个包含所有要保留的变量的 data.frame,然后加入它:

id_data <- select(mydata, ID, age)

mydata %>%
gather(key, val, Test1:Test3, na.rm = T) %>%
right_join(id_data)

关于r - tidyr::gather na.rm 缺少数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44189826/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com