繁体   English   中英

如何对具有最大列数和最小行数的数据框进行子集化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM