【问题标题】:select multiple column that meet a condition选择满足条件的多个列
【发布时间】:2014-03-27 09:46:04
【问题描述】:

我有一个数据框,我想选择所有满足特定条件的行,例如 !=0。我可以为每一列做这件事,但它确实排得很长。

df.Individual  <-  df.category[df.category[,10]!=0 & df.category[,9]!=0 ........ & df.category[,2]!=0, ][,1] 

我想选择一组这样的列,但我不知道怎么做!

df.category[df.category[,c(10:5)]!=0 & c(6:2)]>0 ][,1]

谢谢!

structure(list(Individual = structure(1L, .Label = c("aaa"), class = "factor"), `Class1` = 1L, 
`Class2` = 0L, `Class3` = 1L, `Class4 ` = 2L, `Class5` = 3L, `Class6` = 1L, Class7 = 1L, Class8 =    1L, Class9 = 1L), .Names = c("Individual", 
"Class1", "Class2", "Class3", "Class4", "Class5",  "Class6", "Class7", "Class8", "Class9"), row.names = 2L, class = "data.frame")

编辑:

我需要获取所有列组合。类似于 for 循环的东西。我想要一个为他们的班级排序的个人列表,用作ggplot y轴上的因子水平

例如。但这里只是列出了一些组合,我想要所有可能的列组合。

df.Individual.1  <-  df.category[ df.category[,10]!=0 & 
                                df.category[,9]!=0 & 
                                df.category[,8]!=0 ,] [,1]

df.Individual.2  <-  df.category[ df.category[,10]!=0 & 
                                df.category[,9]!=0 & 
                                df.category[,8]<=0 ,] [,1]

df.Individual.3  <-  df.category[ df.category[,10]!=0 & 
                                df.category[,9]<=0 & 
                                df.category[,8]!=0 ,] [,1]

df.Individual.4  <-  df.category[ df.category[,10]!=0 & 
                                df.category[,9]<=0 & 
                                df.category[,8]<=0 ,] [,1]

unlist(list(df.Individual.1,df.Individual.2,df.Individual.3,df.Individual.4))

最后,我需要一个按班级状态排序的个人列表。 First All Class 是肯定的,第一类是肯定的,另一个是否定的。

1 1 1 
1 1 0
1 0 1
1 0 0
0 1 1
0 1 0    
0 0 1
0 0 0 

这里是 3 列的示例。 谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    我会使用rowSums(比apply 循环快得多)。这是行的逻辑向量,其中 510 的列只有非零:

    rowSums(df.category[,c(5:10)] != 0) == (10-5+1)
    

    或更好:

    rowSums(df.category[,c(5:10)] == 0) == 0
    

    您可以使用&amp; 组合这些逻辑向量,然后使用它从 df.category 中提取:

    logical1 <- rowSums(df.category[,c(5:10)] == 0) == 0
    logical2 <- rowSums(df.category[,c( 2:6)] <= 0) == 0
    df.category[logical1 & logical2, ]
    

    编辑:您更新的问题更加模糊,不妨试试这样的:

    df <- df.category
    classes.col <- grep("Class", colnames(df), value = TRUE)
    df$Attended <- apply(df[classes.col] > 0, 1, paste, sep = "_")
    split(df$Individual, df$Attended)
    

    【讨论】:

    • 我的问题是我想为他们的班级获取个人订单的向量。首先是肯定的,然后是所有其他的组合
    • 我已经编辑了我的问题以使其更清楚。谢谢!
    【解决方案2】:

    一种可能性:

    df[apply(df[,-1]!=0,1,all),]
    

    【讨论】:

      猜你喜欢
      • 2017-10-22
      • 1970-01-01
      • 2012-11-11
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 2015-09-29
      • 1970-01-01
      相关资源
      最近更新 更多