R: фрагмент списка - PullRequest
       8

R: фрагмент списка

1 голос
/ 07 сентября 2011

Мне надоело работать со списками ... и моими ограниченными возможностями R ... Я не мог решить эту проблему долгое время ...

Мой список с несколькими фреймами выглядит следующим образом:

set.seed(456)
sn1 = paste( "X", c(1:4), sep= "")
onelist <- list (df1 <- data.frame(sn = sn1, var1 = runif(4)),
         df2 <- data.frame(sn = sn1, var1 = runif(4)),
        df3 <- data.frame(sn = sn1,var1 = runif(4)))
[[1]]
  sn      var1
1 X1 0.3852362
2 X2 0.3729459
3 X3 0.2179086
4 X4 0.7551050

[[2]]
  sn      var1
1 X1 0.8216811
2 X2 0.5989182
3 X3 0.6510336
4 X4 0.8431172

[[3]]
  sn      var1
1 X1 0.4532381
2 X2 0.7167571
3 X3 0.2912222
4 X4 0.1798831

Я хочу создать список подмножеств, в котором присутствуют только строки 2 и 3.

   srow <-  c(2:3) # just I have many rows in real data 
    newlist <- lapply(onelist, function(y) subset(y, row(y) == srow))

Новый список пуст ....

> newlist
[[1]]
[1] sn   var1
<0 rows> (or 0-length row.names)

[[2]]
[1] sn   var1
<0 rows> (or 0-length row.names)

[[3]]
[1] sn   var1
<0 rows> (or 0-length row.names)

Помогите пожалуйста ....

Ответы [ 2 ]

3 голосов
/ 08 сентября 2011

Это делает это?Обратите внимание на запятую после строк, которая неявно интерпретируется как NULL и приводит к извлечению всех столбцов:

> lapply(onelist, "[", c(2,3),)
[[1]]
  sn      var1
2 X2 0.2105123
3 X3 0.7329553

[[2]]
  sn       var1
2 X2 0.33195997
3 X3 0.08243274

[[3]]
  sn      var1
2 X2 0.3852362
3 X3 0.3729459

Возможно, ваша стратегия подмножества работала с:

lapply(onelist, function(y) subset(y, rownames(y) %in% srow ))

Обратите внимание, что много раз люди используют "==", когда они действительно должны использовать% в%

?match
1 голос
/ 08 сентября 2011

Я не думаю, что функция row делает то, что вы думаете:

Возвращает матрицу целых чисел, указывающую их номер строки в подобном матрице объекте, или коэффициент, обозначающий метки строк.

Глядя на то, что он возвращает в список, который у вас есть

> row(onelist[[1]])
     [,1] [,2]
[1,]    1    1
[2,]    2    2
[3,]    3    3
[4,]    4    4
> row(onelist[[1]])==srow
      [,1]  [,2]
[1,] FALSE FALSE
[2,] FALSE FALSE
[3,] FALSE FALSE
[4,] FALSE FALSE

Вы делаете простое подмножество data.frames, поэтому вы можете просто использовать

newlist <- lapply(onelist, function(y) y[srow,])

что дает

> newlist
[[1]]
  sn      var1
2 X2 0.2105123
3 X3 0.7329553

[[2]]
  sn       var1
2 X2 0.33195997
3 X3 0.08243274

[[3]]
  sn      var1
2 X2 0.3852362
3 X3 0.3729459
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...