Построение списка подмножеств фрейма данных в соответствии со значениями ячеек в R - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть фрейм данных, который я хочу вырезать, и я сохраняю каждое подмножество как элемент нового списка.Разрезы даны в соответствии со значениями клеток.Например, если у меня есть:

> 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 равно значениям, заданным X1 (для верхнего предела) и X2(для нижнего) в df2.Чтобы было понятнее, я хочу, чтобы мой список выглядел следующим образом:

> 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

Знаете ли вы, что не так и / или другой способ получить ожидаемый результат?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Использование цикла 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
0 голосов
/ 07 февраля 2019

Использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...