Изменение имен столбцов фреймов данных в списке

Работа со списками фреймов данных так

library(data.table)
IDn = c("ChrM", "ChrM" ,"ChrM" ,"ChrM" ,"ChrM")   
posn = c(2,5,7,8,9)
met = c(2,0,4,1,0)
nmet = c(2,1,0,2,0)
bd = c(3,3,0,8,10)
dfp = data.frame(IDn,posn,met,nmet,bd)
  IDn     posn met  nmet bd
1 ChrM    2    2    2    3
2 ChrM    5    0    1    3
3 ChrM    7    4    0    0
4 ChrM    8    1    2    8
5 ChrM    9    0    0    10
L1<-list(d1=dfp, d2=dfp, d3=dfp)
    $d1
   IDn posn met nmet bd
1 ChrM    2   2    2  3
2 ChrM    5   0    1  3
3 ChrM    7   4    0  0
4 ChrM    8   1    2  8
5 ChrM    9   0    0 10

$d2
   IDn posn met nmet bd
1 ChrM    2   2    2  3
2 ChrM    5   0    1  3
3 ChrM    7   4    0  0
4 ChrM    8   1    2  8
5 ChrM    9   0    0 10

$d3
   IDn posn met nmet bd
1 ChrM    2   2    2  3
2 ChrM    5   0    1  3
3 ChrM    7   4    0  0
4 ChrM    8   1    2  8
5 ChrM    9   0    0 10

Я хочу изменить, например, имя столбца bd на bd и имя df;

Я пытался использовать lapply и paste0("bd",names(l1)), но этот добавляет 3 имени, когда мне нужно только одно на df.


person Gabriel Hernandez    schedule 09.02.2016    source источник
comment
Легко выполнимо, но зачем вам это? Это означает, что вы получите дополнительные данные, хранящиеся в имени переменной, помимо имени переменной. Почему бы вместо этого не добавить столбец с именем data.frame?   -  person A5C1D2H2I1M1N2O1R2T1    schedule 10.02.2016
comment
Извините, я упростил. Я добавил еще один столбец с условным L1 <- lapply(df, function(x) x[, crit := as.numeric((met + nmet >= cA) & (met>=bd))]). Итак, теперь мне нужно изменить имя столбцов crit на что-то уникальное, чтобы иметь возможность сравнивать их, когда я сворачиваю их в одну таблицу.   -  person Gabriel Hernandez    schedule 10.02.2016
comment
Поскольку вы загрузили data.table, просто используйте rbindlist с idcol = TRUE, чтобы показать, откуда пришли данные.   -  person A5C1D2H2I1M1N2O1R2T1    schedule 10.02.2016
comment
Я хочу сделать таблицу, объединив столбцы, а не строки   -  person Gabriel Hernandez    schedule 10.02.2016
comment
Вы всегда можете перейти от длинного к широкому позже, если вам нужно использовать dcast. Кроме того, вы, кажется, используете синтаксис data.table с data.frames - и используете его неправильно. Если вы использовали :=, вам также не нужно <-.   -  person A5C1D2H2I1M1N2O1R2T1    schedule 10.02.2016


Ответы (1)


Мы можем использовать Map, чтобы обернуть логику, на которую вы ссылались в вопросе:

Map(function(df,i) {names(df)[5] <- paste0("bd", names(L1)[i]);df}, L1, 1:length(L1))
# $d1
#    IDn posn met nmet bdd1
# 1 ChrM    2   2    2    3
# 2 ChrM    5   0    1    3
# 3 ChrM    7   4    0    0
# 4 ChrM    8   1    2    8
# 5 ChrM    9   0    0   10
# 
# $d2
#    IDn posn met nmet bdd2
# 1 ChrM    2   2    2    3
# 2 ChrM    5   0    1    3
# 3 ChrM    7   4    0    0
# 4 ChrM    8   1    2    8
# 5 ChrM    9   0    0   10
# 
# $d3
#    IDn posn met nmet bdd3
# 1 ChrM    2   2    2    3
# 2 ChrM    5   0    1    3
# 3 ChrM    7   4    0    0
# 4 ChrM    8   1    2    8

Для data.table вы можете попробовать:

for(i in 1:length(L1)) setnames(L1[[i]], "bd", paste0("bd", names(L1)[i]))
person Pierre L    schedule 09.02.2016
comment
Я добавил для data.table. Я думаю, что цикл for - самый быстрый способ для этого случая. - person Pierre L; 10.02.2016