2014-08-27 2 views
0

У меня есть несколько файлов, и мне нужно дать каждому уникальный идентификационный код автоматически.Дайте каждой строке файлов список уникальных идентификаторов

До сих пор мне удалось сделать следующее:

datalist <- mapply(cbind, datalist, "temp1"=names(datalist), SIMPLIFY=F) 

который помещает имя файла в новый столбец.

Но тогда я хочу добавить число, от 1: количество строк в каждом файле.

Я пробовал пару вещей, но я действительно не ожидал, что сработает: (тогда я собирался вставить их вместе и удалить столбцы temp), а затем выяснить, как это сделать в одном шаг без временных колонн):

datalist <- mapply(cbind, datalist, "temp2"=1:(sapply(datalist, nrow)), SIMPLIFY=F) 

или

datalist <- mapply(cbind, datalist, "temp2"=1:nrow(datalist), SIMPLIFY=F) 

я могу получить количество строк для одного бита списка (nrow(datalist[[1]])), но я не уверен, как применить это ко всем их, независимо от того, сколько в списке.

Это петля, или есть лучший способ?

Пример набора данных:

datalist <- structure(list(test.raw.data = structure(list(officer.sw = c("bob", 
NA, "brian", "brian", NA), officer.ne = c(NA, "angie", NA, NA, 
NA), officer.nw = c(NA, NA, NA, NA, "lola")), .Names = c("officer.sw", 
"officer.ne", "officer.nw"), class = "data.frame", row.names = c(NA, 
-5L)), test2.raw.data = structure(list(officer.sw = c("bob", 
"NA", "brian", "brian", "NA", "bob", "NA", "bob", "bob", "NA", 
"NA"), officer.ne = c("NA", "angie", "NA", "NA", "NA", "NA", 
"sandy", "NA", "NA", "NA", "NA"), officer.nw = c("NA", "NA", 
"NA", "NA", "lola", "NA", "NA", "NA", "NA", "lola", "NA"), officer.EM = c("NA", 
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "mr bendy" 
), randomothercol = c("angie", "b", "c", "e", "d", "fg", "t", 
"wsefg", "aweg", "lola", "g")), .Names = c("officer.sw", "officer.ne", 
"officer.nw", "officer.EM", "randomothercol"), class = "data.frame", row.names = c(NA, 
-11L))), .Names = c("test.raw.data", "test2.raw.data")) 

ответ

1

Попробуйте это:

makeIndex <- function(x, name, sep="-"){ 
    cbind(index=paste(name, seq_along(x[[1]]), sep=sep), x) 
} 

lapply(seq_along(datalist), function(i)makeIndex(datalist[[i]], names(datalist)[i])) 

Результат:

[[1]] 
      index officer.sw officer.ne officer.nw 
1 test.raw.data-1  bob  <NA>  <NA> 
2 test.raw.data-2  <NA>  angie  <NA> 
3 test.raw.data-3  brian  <NA>  <NA> 
4 test.raw.data-4  brian  <NA>  <NA> 
5 test.raw.data-5  <NA>  <NA>  lola 

[[2]] 
       index officer.sw officer.ne officer.nw officer.EM randomothercol 
1 test2.raw.data-1  bob   NA   NA   NA   angie 
2 test2.raw.data-2   NA  angie   NA   NA    b 
3 test2.raw.data-3  brian   NA   NA   NA    c 
4 test2.raw.data-4  brian   NA   NA   NA    e 
5 test2.raw.data-5   NA   NA  lola   NA    d 
6 test2.raw.data-6  bob   NA   NA   NA    fg 
7 test2.raw.data-7   NA  sandy   NA   NA    t 
8 test2.raw.data-8  bob   NA   NA   NA   wsefg 
9 test2.raw.data-9  bob   NA   NA   NA   aweg 
10 test2.raw.data-10   NA   NA  lola   NA   lola 
11 test2.raw.data-11   NA   NA   NA mr bendy    g 
+0

Как-то, после тестирования оба этих ответов, 'имена (DataList)' 'теперь NULL' ... Я до сих пор нужны имена элементов списка для позже, и я не знаю, почему eentirely они удаляются? – Froom2

+0

Имена вашего оригинального 'datalist' будут изменены только в том случае, если вы назначили новое значение этому объекту. Мое решение не изменяет исходный объект. Если вы хотите, вы можете легко переименовать результат моего ответа, то есть с помощью 'names (...) <- names (datalist)' – Andrie

+0

Спасибо :) Да, я думал о том, чтобы просто переназначить их вчера вечером после того, как я вернулся домой. Спасибо за помощь! Не знаю, какие из этих ответов клевать, они оба настолько похожи! – Froom2

1

Начиная с оригинальным datalist в нижней части вашего поста, вы могли бы сделать некоторые индексирование внутри вызова lapply.

> lapply(seq(datalist), function(i) { 
     datalist[[i]][[paste0("temp", i)]] <- 
      paste0(names(datalist)[i], seq(nrow(datalist[[i]]))) 
     datalist[[i]] 
    }) 
# [[1]] 
# officer.sw officer.ne officer.nw   temp1 
# 1  bob  <NA>  <NA> test.raw.data1 
# 2  <NA>  angie  <NA> test.raw.data2 
# ... 
# 
# [[2]] 
# officer.sw officer.ne officer.nw officer.EM randomothercol   temp2 
# 1   bob   NA   NA   NA   angie test2.raw.data1 
# 2   NA  angie   NA   NA    b test2.raw.data2 
# ... 
Смежные вопросы