[英]How can I subset a data frame with a maximum number of columns and minimun number of rows
我有测试数据,其中列是项目,行是参加测试的人。 0 表示人们回答错误该项目,1 表示人们正确回答该项目,NaN 表示人们在他的测试中没有该项目。 完整的测试有 373 个项目,但每个人在他的测试中只有 120 个随机项目。 问题是:我想创建许多子集,选择许多列(项目),最大可能(如果列在不同的子集中重复并不重要),因此生成的数据帧至少有 30 个观察值(或更多)但没有南的。 我希望所有列都在至少一个子集中。 下面是我的数据示例。 请帮我。 提前致谢。 我的数据在这里: https://www.dropbox.com/s/g6bisriquff6m1u/item_test.csv?dl=0
Observations people-ID Item1 Item2 Item3 Item4 Item5 Item6 Item7 ....
1 abc 0 1 NaN 0 0 NaN 0
2 acb NaN 0 1 NaN 1 0 NaN
3 bca NaN 1 NaN 0 NaN 0 NaN
4 bcd NaN 1 1 0 0 0 NaN
5 cdb 1 NaN 1 NaN 0 NaN 1
6 dbc 0 1 0 0 NaN 0 1
7 abd 1 NaN NaN 0 1 0 1
8 dba NaN 1 0 NaN NaN NaN NaN
9 dab 0 NaN 0 0 NaN 0 1
10 ... ... ... ... ... ... ... ...
您可以使用pivot_longer
将表格转换为整洁(又名瘦)格式。
library(tidyr)
df1 <- pivot_longer(df0,
cols = -c(Observations, people.ID),
names_to = "Questions",
values_to = "Outcome",
values_drop_na = TRUE)
df1
# # A tibble: 39 x 4
# Observations people.ID Questions Outcome
# <int> <chr> <chr> <dbl>
# 1 1 abc Item1 0
# 2 1 abc Item2 1
# 3 1 abc Item4 0
# 4 1 abc Item5 0
# 5 1 abc Item7 0
# 6 2 acb Item2 0
# 7 2 acb Item3 1
# 8 2 acb Item5 1
# 9 2 acb Item6 0
# 10 3 bca Item2 1
# … with 29 more rows
然后,您可以根据需要进行聚合。
library(dplyr)
df1 %>%
group_by(Observations, people.ID) %>%
summarise(`No. Items` = n(), `No. Correct` = sum(Outcome))
# # A tibble: 9 x 4
# # Groups: Observations [9]
# Observations people.ID `No. Items` `No. Correct`
# <int> <chr> <int> <dbl>
# 1 1 abc 5 1
# 2 2 acb 4 2
# 3 3 bca 3 1
# 4 4 bcd 5 2
# 5 5 cdb 4 3
# 6 6 dbc 6 2
# 7 7 abd 5 3
# 8 8 dba 2 1
# 9 9 dab 5 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.