2016-06-24 2 views
0

У меня очень простой вопрос о lapply. Я перехожу из STATA в R, и я думаю, что есть очень простая концепция, что я не собираюсь зацикливаться на R. Но я читал об этом весь день и не могу найти разумный способ сделать это очень просто. ,возвращение из списка в data.frame после lapply

У меня есть три фрейма данных DF1, df2 и DF3, что все имеют одинаковые имена столбцов, в том же порядке, и т.д.

Я хочу переименовать их все столбцы сразу.

Я поставил кадры данных в списке:

dflist <- list(df1, df2, df3) 

То, что я хочу, чтобы новые имена быть:

varlist <- c("newname1", "newname2", "newname3") 

Написать функцию, которая заменяет имена с теми, в списке переменных, и lapply его над кадрами данных

ChangeNames <- function(x) { 
    names(x) <- varlist 
    return(x) 
} 

dflist <- lapply(dflist, ChangeNames) 

Итак, насколько я понимаю, R изменил имена копий кадры данных, которые я ввел в список, но не сами исходные кадры данных. Я хочу, чтобы сами кадры данных были переименованы, а не элементы списка (которые попали в список).

Теперь я могу пойти

df1 <- as.data.frame(dflist[1]) 
df2 <- as.data.frame(dflist[2]) 
df2 <- as.data.frame(dflist[3]) 

Но это кажется странным. Вам нужен цикл, чтобы вернуть элементы цикла?

В принципе: после того, как вы поместили некоторые кадры данных в список и запустили свою функцию на них через lapply, как вы можете вернуть их из списка, не возвращаясь обратно на квадрат?

+1

Я думаю, что больше R путь об этом было бы связать данные 3 кадра вместе, используя что-то вроде 'bigdf <- dplyr :: bind_rows (dflist, .id = "dfid") ', а затем подмножество в столбце' dfid' при необходимости. – Nick

+1

Если структура data.frames имеет аналогичную структуру, рекомендуется сохранить их в списке и работать с ними оттуда.См. [Этот пост] (http://stackoverflow.com/questions/17499013/how-do-i-make-a-list-of-data-frames), в частности, ответ gregor о том, почему это хорошая техника. – lmo

+0

Спасибо Имо за то, что направил меня на этот ответ от gregor. Очень полезно. – VaguelySteamy

ответ

1

Если вы просто хотите изменить имена, это не слишком сложно в R. Помните, что оператор присваивания, <-, может применяться в последовательности. Следовательно:

names(df1) <- names(df2) <- names(df3) <- c("newname1", "newname2", "newname3") 
0

Я не уверен, что я правильно понимаю, вы хотите переименовать столбцы фреймов данных или компонентов списка, которые содержат кадры данных?

Если это первый, пожалуйста, всегда ищите, прежде чем спрашивать, вопрос был задан here.

Так что вы можете легко сделать в случае, если у вас есть еще несколько кадров данных в списке:

# Creating some sample data first 
> dflist <- list(df1 = data.frame(a = 1:3, b = 2:4, c = 3:5), 
+ df2 = data.frame(a = 4:6, b = 5:7, c = 6:8), 
+ df3 = data.frame(a = 7:9, b = 8:10, c = 9:11)) 

# See how it looks like 
> dflist 
    $df1 
    a b c 
1 1 2 3 
2 2 3 4 
3 3 4 5 

$df2 
    a b c 
1 4 5 6 
2 5 6 7 
3 6 7 8 

$df3 
    a b c 
1 7 8 9 
2 8 9 10 
3 9 10 11 

# And do the trick 
> dflist <- lapply(dflist, setNames, nm = c("newname1", "newname2", "newname3")) 

# See how it looks now 
> dflist 

$df1 
    newname1 newname2 newname3 
1  1  2  3 
2  2  3  4 
3  3  4  5 

$df2 
    newname1 newname2 newname3 
1  4  5  6 
2  5  6  7 
3  6  7  8 

$df3 
    newname1 newname2 newname3 
1  7  8  9 
2  8  9  10 
3  9  10  11 

Так имена были изменены из a, b и c к newname1, newname2 и newname3 для каждого типа данных кадр в списке.

Если это второе, вы можете сделать это:

> names(dflist) <- c("newname1", "newname2", "newname3") 
+0

Привет. Мой вопрос заключался не столько в переименовании, сколько в том, чтобы эффективно получать кадры данных из списка после запуска функций с ними. Я просто включил переименование, так как это конкретный пример, с которым я работаю в данный момент, и я знаю, что вы должны дать очень подробные вопросы. Возможно, лучший способ сказать: – VaguelySteamy

+0

- начните с N (потенциально больших) кадров данных с аналогичной структурой - поместите их в список, используйте lapply для выполнения операций над всеми из них (переименование, очистка, перекодировка и т. Д.).) - тогда я хочу вернуться к их использованию в качестве data.frames, чтобы я мог выполнять анализ на них индивидуально/неоднородно. как я получаю очищенные элементы списка из списка и обратно как обычные data.frames (как это было в начале) Сообщение gregor, которое Imo направило на меня, говорит о том, что я должен просто не беспокоиться об этом и держать все в списках все время. – VaguelySteamy