Я сделал несколько попыток добавить определенный столбец во фреймы данных, соответственно.списки в списке, но все попытки *apply()
не смогли сохранить имена фреймов данных.
Например, для списка l
,
l <- list(alpha=data.frame(1:3), bravo=data.frame(4:6), charly=data.frame(7:9))
> l
$`alpha`
X1.3
1 1
2 2
3 3
$bravo
X4.6
1 4
2 5
3 6
$charly
X7.9
1 7
2 8
3 9
Мне нужны начальные буквыимена списков в виде второго id
столбца.Я попробовал эти попытки, которые дают мне в основном то, что я хочу:
lapply(seq_along(l), function(x) cbind(l[[x]], id=substr(names(l)[x], 1, 1)))
# or
lapply(seq_along(l), function(x) data.frame(l[[x]], id=substr(names(l)[x], 1, 1)))
# [[1]]
# X1.3 id
# 1 1 a
# 2 2 a
# 3 3 a
#
# [[2]]
# X4.6 id
# 1 4 b
# 2 5 b
# 3 6 b
#
# [[3]]
# X7.9 id
# 1 7 c
# 2 8 c
# 3 9 c
, но внутренние списки потеряли свои имена.Опция USE.NAMES=TRUE
из lapply()
документации не сработала.
Я также попробовал эти две попытки, но они провалились еще хуже.
lapply(seq_along(l), function(x) mapply(cbind, l[[x]], id=substr(names(l)[x], 1, 1),
SIMPLIFY=FALSE))
rapply(l, function(x) cbind(x, id=substr(names(l)[x], 1, 1)), how="list")
Я знаю, что мог бы сделать это так:
l1 <- lapply(seq_along(l), function(x) cbind(l[[x]], id=substr(names(l)[x], 1, 1)))
names(l1) <- names(l)
или выполните цикл for
:
for(i in seq_along(l)) {
l[[i]] <- data.frame(l[[i]], id=substr(names(l)[i], 1, 1))
}
, но я хотел бы знать, можно ли улучшить решение *apply()
для получения ожидаемого результата, чтобудет:
$`alpha`
X1.3 id
1 1 a
2 2 a
3 3 a
$bravo
X4.6 id
1 4 b
2 5 b
3 6 b
$charly
X7.9 id
1 7 c
2 8 c
3 9 c