2016-01-28 1 views
1

Эй, поэтому я недавно задал вопрос, который я сформулировал довольно плохо, поэтому я хотел снова спросить с лучшим примером. Скажем, у меня есть список dataframes как так:Использование dataframe в списке dataframes как аргумент функции в R и вызов его по его имени

first<- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"), 
      levels = c("Low", "Med", "Hi"), ordered = TRUE), 
      x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9), 
      z = c(1, 1, 1, 2)) 
second<- data.frame(b = factor(c("Med", "Med", "Low", "Low"), 
      levels = c("Low", "Med", "Hi"), ordered = TRUE), 
      x = c("c", "B", "C", "D"), y = c(3, 2, 6, 5), 
      z = c(1, 11, 4, 3)) 

c<- list(first,second) 

Я тогда пошел бы на имя кадры данных в списке:

names(c)<- c("first","second") 

Теперь давайте говорить, что я хотел бы сделать функцию, чтобы взять среднее значение столбца в подмножестве кадра данных «второе». Мой единственный аргумент был бы какой столбец я хотел взять среднее:

test<- function(arg1){ 
    poop<- subset(c$second, c$second$b=="Med") 
    pee<- mean(poop[,arg1]) 
    return(pee) 
} 

Если я протестировать эту функцию из него работает отлично:

test("y") 
[1] 2.5 

Теперь проблема у меня в том, что я хочу чтобы сделать фрейм данных в списке кадров данных аргументом в функции. Это изменило бы это:

test<- function(arg0, arg1){ 
    poop<- subset(c$arg0, c$arg0$b=="Med") 
    pee<- mean(poop[,arg1]) 
    return(pee) 
} 

И если я запускаю тот же код:

test("second","y") 
[1] NA 
Warning message: 
In mean.default(poop[, arg1]) : 
    argument is not numeric or logical: returning NA 

Когда я хотел бы получить 2,5 раз. Я хотел бы вызвать фрейм данных по его имени в списке, а не по любому назначенному номеру элемента. Благодаря!

+1

Не рекомендуется использовать '' $ внутри функции. Используйте '[' – akrun

ответ

1

Мы можем попытаться с [

test<- function(arg1, arg2){ 
    poop <- subset(c[[arg1]], b=='Med') 
    mean(poop[[arg2]]) 
} 

test("second", "y") 
#[1] 2.5 

Или, если нам нужно передать аргументы некотируемые

test<- function(arg1, arg2){ 
    Call <- as.list(match.call())[-1] 
    nm1 <- sapply(Call, deparse) 
    mean(subset(c[[nm1[1]]], b=="Med")[[nm1[2]]]) 
} 

test(second, y) 
#[1] 2.5 
Смежные вопросы