2015-01-15 2 views
0

Я хочу добавить несколько пустых столбцов в несколько фреймов данных. Я знаю, код для этого для 1 dataframe df[,namevector] <- NA (other question). Namevector - это вектор, который содержит имена пустых переменных, которые необходимо добавить. У меня есть список нескольких фреймов данных, поэтому я подумал, что следующий код будет делать трюк.Добавление пустых столбцов в несколько фреймов данных

a <- data.frame(x = 1:10, y = 21:30) 
b <- data.frame(x = 1:10, y = 31:40) 
c <- list(a,b) 
namevector <- c("z","w")  

EmptyVariables <- function(df) {df[,namevector] <- NA} 
sapply(X = c, FUN = EmptyVariables) 

У меня нет сообщения об ошибке, но эти 2 строки кода также не добавляют пустые столбцы.

+1

Вы не присвоили результаты символу в глобальной среде, поэтому они существовали только внутри этого 'sapply' и затем были помечены для сбора мусора. Однако функция 'sapply' НЕ изменила исходные данные. Добро пожаловать в функциональное программирование. –

+0

Была дополнительная проблема, которую я не узнал, и это было то, что возвращаемое значение из функции «Пустые переменные» было NA. Он должен быть определен как '<- function (df) {df [, namevector] <- NA; df} ' –

ответ

1

В принципе решение есть в комментариях от BondedDust, но, возможно, некоторые дополнительные объяснения могут помочь.

Почему ваш исходный код не работает? Есть две вещи, чтобы сказать об этом:

  • как упомянуто BondedDust, назначение внутри функции EmptyVariables делается в среде функции. Таким образом, изменена только локальная копия кадра данных df, но неdf, который существует в глобальной среде. Звонок EmtpyVariables(a) оставляет a без изменений.
  • Функция возвращает выход из своей последней строки. Так как последняя строка EmptyVariables является назначением, и поскольку присваивания ничего не возвращают в R, функция также ничего не возвращает. Именно по этой причине вы просто получаете NA дважды от своего звонка до sapply. Решение этого уже было указано BondedDust: тело функции должно быть {df[,namevector] <- NA;df}. В этом случае измененный кадр данных возвращается в результате функции.

Также комментарий относительно sapply: Эта функция пытается вернуть вектор или матрицу. Но ваш список фреймов данных не может быть разумно упрощен таким образом, и поэтому вы должны использовать lapply.

Наконец, это код, который должен делать то, что вы хотите:

EmptyVariables <- function(df) {df[,namevector] <- NA;df} 
res <- lapply(X = c, FUN = EmptyVariables) 

res будет список, содержащий два кадра данных. Таким образом, res[[1]] и res[[2]] предоставят вам a и b с пустыми столбцами, добавленными соответственно.

+0

Большое спасибо. Я понял это на основе объяснения BondedDusts, но хорошо иметь более подробное объяснение, возможно, в будущем. – 1053Inator