r создать столбец, содержащий имена объектов внутри функции lapply
Я хотел бы создать столбец, который содержит имена объектов внутри функции lapply, в качестве прокси я называю это name.of.x.as.strig.function(), к сожалению, я не уверен, как это сделать, может быть, комбинация присвоения, do.call и вставки. Но пока использование этой функции только привело к более глубоким проблемам, я вполне уверен, что есть более R-подобное решение.
# generates a list of dataframes,
data <- list(data.frame(c(1,2),c(3,3)),data.frame(c(1,2),c(3,3)),data.frame(c(1,2),c(3,3)),data.frame(c(1,2),c(3,3)))
# assigns names to dataframe
names(data) <- list("one","two", "tree", "four")
# subsets the second column into the object data.anova
data.anova <- lapply(data, function(x){x <- x[[2]];
return(matrix(x))})
Это должно позволить мне создать столбец внутри фрейма данных, содержащий его имя, для всех матриц в списке
data.anova <- lapply(data, function(x){
x$id <- name.of.x.as.strig.function(x)
return(x)})
Я хотел бы получить:
3 one
3 one
3 two
3 two
...
Любой вклад высоко ценится.
История поиска: функция для извлечения имени объекта в виде строки, R - для получения имени объекта внутри lapply...
2 ответа
Может быть, вы просто ищете stack
?
stack(lapply(data, `[[`, 2))
# values ind
# 1 3 one
# 2 3 one
# 3 3 two
# 4 3 two
# 5 3 tree
# 6 3 tree
# 7 3 four
# 8 3 four
(Или, используя ваш оригинальный подход: stack(lapply(data, function(x) {x <- x[[2]]; x}))
)
Если это так, melt
от "reshape2" также будет работать.
Перебрать индексы data.anova
и используйте его для извлечения данных и имен:
data.anova <- lapply(seq_along(data.anova), function(i){
x <- as.data.frame(data.anova[[i]])
x$id <- names(data.anova)[i]
return(x)})
Это производит:
# [[1]]
# V1 id
# 1 3 one
# 2 3 one
# [[2]]
# V1 id
# 1 3 two
# 2 3 two
# [[3]]
# V1 id
# 1 3 tree
# 2 3 tree
# [[4]]
# V1 id
# 1 3 four
# 2 3 four