Разделить набор данных из вектора - PullRequest
0 голосов
/ 08 мая 2020

Я хотел бы выбрать подмножество из набора данных df с помощью вектора division_value и применить минимум для каждого df1, df2 и df3.

Input

df <- data.frame(id = c(1, 3, 4, 5, 7, 8, 9), x = runif(7), y = rnorm(7))
df

  id          x            y
  1 0.15316440  0.300897329
  3 0.17532977 -1.348602492
  4 0.02923305  0.573446127
  5 0.50233682 -0.415615162
  7 0.65804355  0.003661438
  8 0.52747538 -0.097006421
  9 0.12545577  2.043525380

division_value <- c(3, 6, 9)

Ожидаемый результат

 > df1
 id          x            y
  1 0.15316440  0.300897329
  3 0.17532977 -1.348602492

apply(df1[, -1], 2, min)

 > df2
  id          x            y
  4 0.02923305  0.573446127
  5 0.50233682 -0.415615162

 apply(df2[, -1], 2, min)

 > df3
 id          x            y
  8 0.52747538 -0.097006421
  9 0.12545577  2.043525380

apply(df3[, -1], 2, min)

1 Ответ

1 голос
/ 08 мая 2020

Вы можете попробовать подход с split:

split.f <- split(f,sapply(f$id,function(x){sum(x > division_value)})+1)
split.f
$`1`
  id         x          y
1  1 0.6516738 -0.4115108
2  3 0.1255551  0.2522234

$`2`
  id         x          y
3  4 0.2672207 -0.8919211
4  5 0.3861141  0.4356833

$`3`
  id          x          y
5  7 0.01339033 -1.2375384
6  8 0.38238796 -0.2242679
7  9 0.86969085  0.3773956

result <- sapply(split.f,function(x){apply(x[,-1],2,min)})
result
           1          2           3
x  0.1255551  0.2672207  0.01339033
y -0.4115108 -0.8919211 -1.23753842

Я знаю, что это не совсем соответствует вашему ожидаемому результату, но действительно ли это то, что вы хотите?

Вы также можете установите имена для соответствия division_value:

colnames(result) <- division_value
result
           3          6           9
x  0.1255551  0.2672207  0.01339033
y -0.4115108 -0.8919211 -1.23753842
...