根据R中单元格的值构建的数据帧的子集的列表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据R中单元格的值构建的数据帧的子集的列表相关的知识,希望对你有一定的参考价值。

我有我要削减,并保持每个子集作为一个新的列表的元素的数据帧。该切口是根据细胞的值给出。举例来说,如果我有:

> df

     X1   X2
1     red  1
2    blue  3
3   green  2
4  pierre 10
5    pink  4
6    blue  3
7   green  2
8    eric 25
9  purple  8
10    red  1
11   anna 30
12   blue  3
13  green  2
14  black  5
15 yellow  6
16  marie 40
17 violet  7 

> df2

      X1    X2  X3
1 pierre  eric  77
2   anna marie 100

我想切割DF中的子集,其中限制是其中X1的值DF2等于给定的由X1(对于上限)的值和X2(对于低级)的行。为了更清楚,我想我的名单看起来是这样的:

> list
[[1]] 
     X1   X2    
4  pierre 10
5    pink  4
6    blue  3
7   green  2
8    eric 25
[[2]]
     X1   X2
11   anna 30
12   blue  3
13  green  2
14  black  5
15 yellow  6
16  marie 40

我试着做它用一个for循环做:

> for (i in 1:nrow(df2)){
   list[i]<-list(df[which(df[,"X1"]==df2[i,"X1"]):which(df[,"X1"]==df2[i,"X2"]),])
  }     

但我得到以下错误信息:

Error in list[i] <- list(df[which(df[, "X1"] == df2[i, "X1"]):which(df[,  : 
  object of type 'builtin' is not subsettable

你知道什么是错的和/或不同的方式来获得预期的结果?

答案

使用for循环的作品,虽然@ zx8754的mapply()的方法应该是更有效的。

test <- vector("list", nrow(df2))
for(i in 1:nrow(df2)){
  x <- which(df[, "X1"] == df2[i, "X1"])
  y <- which(df[, "X1"] == df2[i, "X2"])
  test[[i]] <- df[x:y,]
}

> test
[[1]]
      X1 X2
4 pierre 10
5   pink  4
6   blue  3
7  green  2
8   eric 25

[[2]]
       X1 X2
11   anna 30
12   blue  3
13  green  2
14  black  5
15 yellow  6
16  marie 40
另一答案

使用mapply:

mapply(function(x, y){
  df[ which(df$X1 == x):which(df$X1 == y), ]
  }, x = df2$X1, y = df2$X2, SIMPLIFY = FALSE)
# $pierre
# X1 X2
# 4 pierre 10
# 5   pink  4
# 6   blue  3
# 7  green  2
# 8   eric 25
# 
# $anna
# X1 X2
# 11   anna 30
# 12   blue  3
# 13  green  2
# 14  black  5
# 15 yellow  6
# 16  marie 40

以上是关于根据R中单元格的值构建的数据帧的子集的列表的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:根据条件为多索引数据帧的子集设置值的正确方法

如何根据单元格的值使单元格颜色RGB值发生变化? (在Excel中)

Excel VBA 根据下拉框单元格的值来改变另一个下拉框单元格的值

在R中,获取数据框的子集,其中列中的值包含在列表中[重复]

R:基于多个条件的两个数据帧的子集

如何根据 R 中的原始文件名将包含多个数据帧的大列表保存为单个 csv