2013-07-18 3 views
1

Насколько я понимаю, при использовании r может быть более элегантным использование таких функций, как lapply, а не для циклов (которые чаще всего используются в других объектно-ориентированных языках). Однако я не могу разглядеть синтаксис и делать глупые ошибки при попытке выполнить простые задачи с помощью команды. Например:Правильная реализация lapply

У меня есть ряд dataframes, загруженных из CSV-файлов, используя для loop.The следующих фиктивных dataframes адекватно описывают данные:

x <- c(0,10,11,12,13) 
y <- c(1,NA,NA,NA,NA) 
z <- c(2,20,21,22,23)  
a <- c(0,6,5,4,3) 
b <- c(1,7,8,9,10) 
c <- c(2,NA,NA,NA,NA) 
df1 <- data.frame(x,y,z) 
df2 <- data.frame(a,b,c) 

Я первый сгенерирует список имен dataframe (data_names- I сделайте это при загрузке файлов csv), а затем просто захотите суммировать столбцы. Моя попытка, конечно, не работает:

lapply(data_names, function(df) { 
counts <- colSums(!is.na(data_names)) 
}) 

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

Большое спасибо за любые указатели

+1

Вы хотите использовать 'df' в своей функции, а не' data_names' ... – Justin

+0

+1 для воспроизводимого примера –

ответ

2

Это действительно просто ваше использование is.na и тот факт, что вам не нужно использовать asignment оператор <- внутри функции. lapply возвращает список, который является результатом применения FUN к каждому элементу списка входных данных. Вы назначаете выход lapply переменной, например. res <- lapply(.... , FUN).

Я также не слишком уверен, как вы сделали список изначально, но ниже должно быть достаточно. Вам также не нужны анонимная функция в этом случае, вы можете использовать именованный colSums, а также обеспечить na.rm = TRUE аргумент, чтобы заботиться о Перском NA с в ваших данных:

lapply(list(df1, df2) , colSums , na.rm = TRUE) 
[[1]] 
x y z 
46 1 88 

[[2]] 
a b c 
18 35 2 

Таким образом, вы можете прочитать как:

  • Для каждого ФР в списке:
  • применяются colSums с аргументом na.rm = TRUE

Результатом является список, каждый элемент которого является результатом применения colSums к каждому df в списке.

+0

Ах, отлично, приятно видеть, что набирать текст можно еще больше. Спасибо за ваш быстрый и красноречивый ответ. – user1912925

+0

В качестве дополнения я понимаю, что я также могу использовать свою оригинальную версию в этой форме: 'lapply (list (df1, df2), function (x) {colSums (! Is.na (x))})', чтобы я мог считать количество значений в столбцах. – user1912925

+0

@ user1912925 уверен, да - я не понимал, что это то, что вы хотели сделать, но уверен, что это сработает. –

Смежные вопросы