2015-02-12 6 views
0

У меня есть 7 кадров данных, где первая переменная представляет собой список из 50 состояний. Проблема в том, что в некоторых из них государства - это все капиталы, все в нижнем регистре или смешанные. Вместо того, чтобы писать 7 разных команд tolower(), мне было интересно, есть ли способ сделать это, используя loop или lapply()?Изменение переменной в списке данных в R

Я пробовал эти два пути, и ни один не работал:

ivs <- c("taxes","urban","gini","educ","inc","cong"))## a character vector of the data frame names 

for (i in length(1:ivs)){ 
    i$state <- tolower(i$state) 
} 

и этот путь:

ivs <- c("taxes","urban","gini","educ","inc","cong")) 


sapply(ivs, function(x) { 
    x$state <- tolower(x$state) 
    }) 

Спасибо за помощь!

+0

не '1: ivs' дает вам полезную ошибку? – rawr

ответ

0

Вы могли бы попробовать что-то вроде:

for(v in ivs){ 
    eval(parse(text=paste0(v,"$state <- tolower(",v,"$state)"))) 
} 
+1

@stanO вы * мог * попробуйте. вы не должны * попробовать * – rawr

+0

Вы должны знать об [опасностях eval (parse())] (http://stackoverflow.com/questions/13649979/what-specifically-are-the-dangers-of-evalparse). Есть почти всегда больше «R-подобных» способов делать такие вещи. – MrFlick

+0

согласился: это не самый R-образный способ решения исходной проблемы. Я предложил его, потому что он ближе всего к исходной идее зацикливания на именах кадров данных. –

0

Попробуйте это, если вы хотите использовать для цикла

ivs <- list(taxes,urban,gini,educ,inc,cong))## Put your dataframes into a list 

for (i in ivs){ 
    i$state <- tolower(i$state) 
} 
0

Вы можете поместить apply в lapply

Пример:

l <- 
    list(
data.frame(state = c("ARIZONA", "teXaS")), 
data.frame(state = c("arizona", "TEXAS")), 
data.frame(state = c("AriZonA", "TEXaS")) 
) 

lapply(l, function(x) apply(x[1], 2, tolower)) 


#[[1]] 
#  state  
#[1,] "arizona" 
#[2,] "texas" 
# 
#[[2]] 
#  state  
#[1,] "arizona" 
#[2,] "texas" 
# 
#[[3]] 
#  state 
#[1,] "arizona" 
#[2,] "texas" 
0
lapply(dflist, function(df) { 
    df[[1]] <- tolower(df[[1]]) 
    df 
})