根据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中单元格的值构建的数据帧的子集的列表的主要内容,如果未能解决你的问题,请参考以下文章
如何根据单元格的值使单元格颜色RGB值发生变化? (在Excel中)