Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 超大数据集的多条件子集划分_R_Subset_Large Data - Fatal编程技术网

R 超大数据集的多条件子集划分

R 超大数据集的多条件子集划分,r,subset,large-data,R,Subset,Large Data,我有一个矩阵,大约是430x2000。每一行都是一个人,每一列都是他们从事的项目。每个单元格的值为0-未涉及,1-项目负责人,每个项目只有一个,2-项目助手。我试图只看一个人负责的项目。我一次只想看一个人。所以对于人A,我需要r删除所有人的值不是1的列。但我想在这些列中保留关于其他人的所有数据 例: 我想给B个人买点东西,把他们没有头的柱子掉下来 Name Project 2...... Project 2,000 Person A 0

我有一个矩阵,大约是430x2000。每一行都是一个人,每一列都是他们从事的项目。每个单元格的值为0-未涉及,1-项目负责人,每个项目只有一个,2-项目助手。我试图只看一个人负责的项目。我一次只想看一个人。所以对于人A,我需要r删除所有人的值不是1的列。但我想在这些列中保留关于其他人的所有数据

例:

我想给B个人买点东西,把他们没有头的柱子掉下来

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

很抱歉,如果这是显而易见的,出于某种原因,我真的很难为这么大的数据找到示例,也就是说,我不能只键入列名,因为列名太多了。任何帮助都将不胜感激

因此,您要做的只是根据其中一行中的值选择数据帧的列。使用与您的示例类似的数据帧:

> df
#      Name Project1 Project2 Project2000
#1 Person A        1        0           2
#2 Person B        0        1           1
#3 Person C        2        2           2
为了为(比如)人员B选择列,您需要一个逻辑向量来指示要保留哪些列,即长度与数据帧中的列数相同的向量,并且该向量的值为TRUE,否则为FALSE

您几乎可以通过以下方式完成此操作:

> leadB <- df[2,]==1
#   Name Project1 Project2 Project2000
#2 FALSE    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

然后,将leader_dfn的值从1到行数计算n,将得到每个项目负责人的数据帧。

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

创建数据:

> 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

假设您的数据名为df,第一列为Name,其他所有列均为projects,则这应该为一个人完成工作,例如person B:

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

如果您需要更多人使用此数据集,请按照akrun的建议将其放入循环中,并将输出存储在列表中。

按照我的标准,这不是一个很大的数据集,可能不需要进行额外的优化。请提供一个可复制的示例,说明所需结果的样子。如果您要查找每个人,则可能需要一个循环假设您的数据称为df,第一列为Name,所有其他列为projects,这应该可以为一个人完成此工作,例如person B:df_B=df[,df[2,]==1]。如果您需要更多人使用此功能,请按照akrun的建议进行循环,并将输出存储在listHi Roman中,抱歉,我不确定您所说的可复制示例是什么意思……基本上到最后,我希望每个成员都有430个单独的矩阵,其中只包括该成员担任负责人的项目的数据。mts:这正是我所需要的!!!!!谢谢对于其他偶然发现这一点的人来说,mts发布的代码中缺少一个括号,但效果很好!:df_B如果名称是数据帧的row.Names,而不是column,那么这实际上会更干净,因此所有df值都是数字。根据您的用例,这可能是可取的,也可能不是可取的。
> 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
> 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
df_B = df[, (df[2,] == 1)]