2015-01-20 4 views
1

Допустим, у меня есть три набора данных:Использование lapply для создания новых переменных через наборы данных, обусловливающие не существует

df1 <- data.frame(var1 = c(1,2,3), var2 = c(1,2,3)) 
df2 <- data.frame(var1 = c(1,2,3), var2 = c(1,2,3)) 
df3 <- data.frame(var1 = c(1,2,3), var2 = c(1,2,3), var3 = c(1,2,3)) 

Я хотел бы проверить, является ли переменная «var3» существует в каждом наборе данных. Если это не так, я хотел бы создать пустую переменную, называемую «var3». Вот что я пытаюсь:

dframes <- list(df1,df2,df3) 

lapply(dframes, function(df) { 
    ifelse("var3" %in% colnames(df), print("var3 exists"), df$var3 <- NA) 
}) 

Выход выходит как:

[[1]] 
[1] NA 

[[2]] 
[1] NA 

[[3]] 
[1] "var3 exists" 

И желательно «var3» переменная не генерируется в течение первых двух наборов данных - они по-прежнему содержат только " var1 "и" var2 ".

Вам нужна помощь.

+2

Добавить 'возвратный (DF)' в ваша функция –

+0

Вам не нужно 'return', просто' df' будет достаточно. Кроме того, ваша функция 'print' не будет слишком информативной, если вы хотите где-то сохранить эти результаты, поскольку' lapply' не обновляет ваши наборы данных, а печатает желаемые результаты. –

+0

Большое спасибо @DavidArenburg и @MaratTalipov. Если бы я хотел, чтобы результаты обновили набор данных, как бы я это сделал? Я пробовал 'df <- as.data.frame (df)', но сохраненные наборы данных остались прежними. – muadhib

ответ

1

Просто положить, что все сказал в полный ответ:

df1 <- data.frame(var1 = c(1,2,3), var2 = c(1,2,3)) 
df2 <- data.frame(var1 = c(1,2,3), var2 = c(1,2,3)) 
df3 <- data.frame(var1 = c(1,2,3), var2 = c(1,2,3), var3 = c(1,2,3)) 

dframes <- list(df1,df2,df3) 

dfframes_fmt <- lapply(dframes, function(df) { 
    if(! "var3" %in% colnames(df)) { 
    df$var3 <- NA 
    } 
    df 
}) 

> dfframes_fmt 
[[1]] 
    var1 var2 var3 
1 1 1 NA 
2 2 2 NA 
3 3 3 NA 

[[2]] 
    var1 var2 var3 
1 1 1 NA 
2 2 2 NA 
3 3 3 NA 

[[3]] 
    var1 var2 var3 
1 1 1 1 
2 2 2 2 
3 3 3 3 

Для того, чтобы обновить до оригинальных имен, вы можете сделать это:

dfnames <- c("df1", "df2", "df3") 
# assemble the list of data frames 
dframes <- eval(parse(text = paste0("list(", paste0(dfnames, collapse = ","), ")"))) 

for(k in seq_along(dframes)){ 
    set <- dframes[[k]] 
    if(! "var3" %in% colnames(set)) { 
    set$var3 <- NA 
    } 
    # assign the df back to the original name 
    eval(parse(text = paste0(dfnames[k], " = set"))) 
} 


> df1 
    var1 var2 var3 
1 1 1 NA 
2 2 2 NA 
3 3 3 NA 
> df2 
    var1 var2 var3 
1 1 1 NA 
2 2 2 NA 
3 3 3 NA 
> df3 
    var1 var2 var3 
1 1 1 1 
2 2 2 2 
3 3 3 3 
+0

Не могли бы вы добавить в строку, которая будет обновлять наборы данных 'df1',' df2' и 'df3', а не просто выводить результаты? Еще раз спасибо @ mkemp6. – muadhib

+0

@ mkempf6 Это замечательно. У меня было бы много проблем с этим. Большое спасибо. – muadhib

+0

Нет проблем! Не могли бы вы принять его в качестве ответа, если он ответил на ваш вопрос так, как вы предполагали? – mlegge