Как получить итерационные префиксы для имен строк в подсписках с помощью rapply? - PullRequest
1 голос
/ 07 мая 2019

Я знаю, как добавить строку к именам строк списка с помощью rapply.

out1 <- rapply(L, function(x) 
  `rownames<-`(x, paste0("lala.", rownames(x))), how="list")

out1$a$ct
#        x1 x2 x3
# lala.a  1  1  1
# lala.b  1  1  1

Как это можно сделать, если я хочу перебрать строку в зависимости от имени подсписка?

В lapply ситуациях я бы повторял последовательности с lapply(seq_along(L), но я не уверен, работает ли это с rapply. Э.Г.

out2 <- rapply(seq_along(L), function(x) names(L)[x], how="list")

не будет работать, и это даст

Error in rapply(seq(L), function(x) names(L[[x]]), how = "list") : 
  'object' must be a list or expression

Может быть, мне нужен еще *apply например mapply

Редактирование: Интересно, можно ли это сделать в рамках одного вызова базовой функции из семейства *apply.

Я тоже пробовал outer

outer(seq(L$a),seq(L$b), Vectorize(function(x, y) 
  `rownames<-`(L[[x]][[y]], paste0(names(L[[x]])[y], ".", rownames(L[[x]][[y]])))))

, который не смог:

Error in dim(robj) <- c(dX, dY) : 
  dims [product 4] do not match the length of object [24]

, а

x <- 1; y <- 2
`rownames<-`(L[[x]][[y]], paste0(names(L[[x]])[y], ".", rownames(L[[x]][[y]])))
#      x1 x2 x3
# tr.a  1  1  1
# tr.b  1  1  1

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

# $a
# $a$ct
# x1 x2 x3
# ct.a  1  1  1
# ct.b  1  1  1
# 
# $a$tr
# x1 x2 x3
# tr.a  1  1  1
# tr.b  1  1  1
# 
# 
# $b
# $b$ct
# x1 x2 x3
# ct.a  1  1  1
# ct.b  1  1  1
# 
# $b$tr
# x1 x2 x3
# tr.a  1  1  1
# tr.b  1  1  1

Данные

L <- list(a = list(ct = structure(c(1, 1, 1, 1, 1, 1), .Dim = 2:3, .Dimnames = list(
    c("a", "b"), c("x1", "x2", "x3"))), tr = structure(c(1, 1, 
1, 1, 1, 1), .Dim = 2:3, .Dimnames = list(c("a", "b"), c("x1", 
"x2", "x3")))), b = list(ct = structure(c(1, 1, 1, 1, 1, 1), .Dim = 2:3, .Dimnames = list(
    c("a", "b"), c("x1", "x2", "x3"))), tr = structure(c(1, 1, 
1, 1, 1, 1), .Dim = 2:3, .Dimnames = list(c("a", "b"), c("x1", 
"x2", "x3")))))

1 Ответ

1 голос
/ 07 мая 2019

Я не уверен, что это то, что вам нужно, но вы можете использовать Map / mapply для перебора ваших data.frames и их имен и использовать lapply для вашей структуры списка второго порядка.

addString2RowName <- function(df, string) {
  row.names(df) <- paste(string, rownames(df), sep = ".")
  df
}

lapply(L, function(l) Map(addString2RowName, df = l, string = names(l)))
...