Добавление нового столбца к каждому элементу в списке таблиц или фреймов данных
У меня есть список файлов. У меня также есть список "имен", которые я substr()
из фактических имен файлов этих файлов. Я хотел бы добавить новый столбец для каждого из файлов в списке. Этот столбец будет содержать соответствующий элемент в "именах", повторяемых количество строк в файле.
Например:
df1 <- data.frame(x = 1:3, y=letters[1:3])
df2 <- data.frame(x = 4:6, y=letters[4:6])
filelist <- list(df1,df2)
ID <- c("1A","IB")
ПСЕВДОКОД
for( i in length(filelist)){
filelist[i]$SampleID <- rep(ID[i],nrow(filelist[i])
}
//в основном создаем новый столбец в каждом из фреймов данных в списке файлов, и заполняем столбец повторяющимися соответствующими значениями ID
мой вывод должен быть как:
filelist[1]
должен быть:
x y SAmpleID
1 1 a 1A
2 2 b 1A
3 3 c 1A
fileList[2]
x y SampleID
1 4 d IB
2 5 e IB
3 6 f IB
и так далее.....
Любая идея, как это можно сделать.
Ответы
Ответ 1
Альтернативным решением является использование cbind и использование того факта, что R будет возвращать значения более короткого вектора.
Пример
x <- df2 # from above
cbind(x, NewColumn="Singleton")
# x y NewColumn
# 1 4 d Singleton
# 2 5 e Singleton
# 3 6 f Singleton
Нет необходимости использовать rep
. R делает это для вас.
Итак, вы можете положить cbind(filelist[[i]], ID[[i]])
в свой for loop
или как указано @Sven, вы можете использовать очиститель mapply
:
filelist <- mapply(cbind, filelist, "SampleID"=ID, SIMPLIFY=F)
Ответ 2
Это скорректированная версия вашего цикла:
for( i in seq_along(filelist)){
filelist[[i]]$SampleID <- rep(ID[i],nrow(filelist[[i]]))
}
Было 3 проблемы:
- Окончательный
)
отсутствовал после команды в теле.
- Элементы списков доступны
[[
, а не [
. [
возвращает список длиной один. [[
возвращает только элемент.
-
length(filelist)
- это всего лишь одно значение, поэтому цикл выполняется только для последнего элемента списка. Я заменил его на seq_along(filelist)
.
Более эффективный подход заключается в использовании mapply
для задачи:
mapply(function(x, y) "[<-"(x, "SampleID", value = y) ,
filelist, ID, SIMPLIFY = FALSE)
Ответ 3
Сложный способ:
library(plyr)
names(filelist) <- ID
result <- ldply(filelist, data.frame)
Ответ 4
Этот работал для меня:
Создайте новый столбец для каждого кадра данных в списке; заполните значения нового столбца на основе существующего столбца. (В вашем случае идентификаторы).
Пример:
# Create dummy data
df1<-data.frame(a = c(1,2,3))
df2<-data.frame(a = c(5,6,7))
# Create a list
l<-list(df1, df2)
> l
[[1]]
a
1 1
2 2
3 3
[[2]]
a
1 5
2 6
3 7
# add new column 'b'
# create 'b' values based on column 'a'
l2<-lapply(l, function(x)
cbind(x, b = x$a*4))
Результаты в:
> l2
[[1]]
a b
1 1 4
2 2 8
3 3 12
[[2]]
a b
1 5 20
2 6 24
3 7 28
В вашем случае что-то вроде:
filelist<-lapply(filelist, function(x)
cbind(x, b = x$SampleID))