在非常大的数据集中使用多个条件进行子集

时间:2015-07-05 13:37:01

标签: r subset large-data

我有一个大约430 X 20,000的矩阵。每一行都是一个人,每一列都是他们所处理的项目。每个单元格的值为0 - (不涉及),1 - (项目负责人,每个项目只有一个),2 - (项目助手)。我试图只看一个人的头部项目。我只想一次看一个人。所以对于Person A,我需要删除那个人的值不是1的所有列。但是我想保留那些列中其他个体的所有数据。

例如:

 Name   Project 1   Project 2......Project 2,000
Person A      1            0                    2
Person B      0            1                    1
Person C      2            2                    2

我正在尝试为B组提供一些可以删除他们没有头的列。

 Name    Project 2......   Project 2,000
Person A      0                    2
Person B      1                    1
Person C      2                    2

很抱歉,如果这是显而易见的,由于某种原因,我真的很难找到这么大的数据示例(a.k.a我不能只输入列名,因为有太多)。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

因此,您要做的只是根据之一中的值选择数据框的 columns 。使用类似于您的示例的数据框:

> df
#      Name Project1 Project2 Project2000
#1 Person A        1        0           2
#2 Person B        0        1           1
#3 Person C        2        2           2

为了选择"Person B"的列,你需要一个逻辑向量来指示要保留的列,即一个长度与数字相同的向量您的数据框中的列数,并且列的值TRUE包含在结果中,否则为FALSE

您可以几乎执行此操作:

> leadB <- df[2,]==1
#   Name Project1 Project2 Project2000
#2 FALSE    FALSE     TRUE        TRUE

选择正确的项目,但会删除Name列;为了也包括该列,我们使用:

> leadB <- c(TRUE, df[2,-1]==1)
#[1]  TRUE FALSE  TRUE  TRUE

然后使用此向量从数据框中选择列:

> df_B <- df[,leadB]
#      Name Project2 Project2000
#1 Person A        0           2
#2 Person B        1           1
#3 Person C        2           2

当然,您可以在一行中执行此操作,"Person B"行没有什么特别之处,因此您可以使用一个函数为行n中的人返回所需的数据帧:

leader_df <- function(n){
    df[,c(TRUE, df[n,-1]==1)]
}

然后将leader_df(n)的{​​{1}}值从1到行数进行评估将为每个项目负责人提供数据帧。

答案 1 :(得分:1)

您可以通过首先搜索与所考虑的特定人员相对应的行来轻松解决此问题。然后,您可以找到此人员是项目负责人的相关列,并从数据框中提取这些列(包括人员姓名)。以下示例:

创建数据:

> person = c("John", "Willy", "Bob", "Anna", "Tom","Billy") 
> project1 = c(1, 0, 2, 0, 0,2) 
> project2 = c(1, 2, 0, 2, 0,0) 
> project3 = c(2, 0, 1, 0, 2,0)       # df is a data frame
> project4 = c(0, 0, 0, 1, 2,0)
> projects <- data.frame(person,project1,project2,project3,project4)

> projects
  person project1 project2 project3 project4
1   John        1        1        2        0
2  Willy        0        2        0        0
3    Bob        2        0        1        0
4   Anna        0        2        0        1
5    Tom        0        0        2        2
6  Billy        2        0        0        0

获取John的相关信息。请注意,我们需要使用人名明确添加列:

> findPerson = "John"
> rowIndex <- which(projects$person==findPerson)
> columnIndex <- c(1,which(projects[rowIndex,]==1))
> if(length(columnIndex) > 1) # Only generate table if projectleader for at least one project
+   result <- projects[,columnIndex]

> result
  person project1 project2
1   John        1        1
2  Willy        0        2
3    Bob        2        0
4   Anna        0        2
5    Tom        0        0
6  Billy        2        0

答案 2 :(得分:0)

假设您的数据被称为df并且第一列是Name而所有其他列都是项目,那么这应该为一个人完成工作,例如&#34; B&#34;:

df_B = df[, (df[2,] == 1)]

如果您需要更多人,请将其置于akrun建议的循环中,并将您的输出存储在列表中。