2016-05-20 3 views
0

Я довольно новый для R и этот вопрос может показаться странным .. У меня есть data.frame с именами других data.frames в первой колонке:Как получить доступ к данным data.frame, когда имя data.frame сохраняется в data.frame?

> data 
    tablename avg_size 
1  ttest  5000 
2 testsheet 15000 
5 ttest2 15000 
6 mtcars 13000 

Тогда то, что я хотел бы сделать, это получить имена таблиц (это data.frames) и запустить некоторые функции над этими data.frames. Например, я хотел бы получить сумму в каждой ВПЛ таблицы, это было возможно с помощью

missing_values <- sum(is.na(eval(as.name(as.vector(data[1]))))) 

Моя проблема заключается в том, что 1) это выглядит немного слишком сложно, и я думаю, что может быть лучше решения? 2) С другими функциями у меня возникают проблемы, например.

infinite_values <- sum(is.infinite(as.numeric(eval(as.name(as.vector(data[1])))))) 

Это не работает, вставка «as.numeric» не помогла.

Может кто-нибудь помочь?

EDIT: Спасибо за ответы! Я попытался как

infinite_values <- sum(is.infinite(as.numeric(eval(as.name(as.vector(data[1])))))) 

и

 obg <- mget(as.character(data[,1])) 

но она возвращает "Ошибка: Значения для''ttest'' не найден." Поскольку это решение, похоже, работает на вас, что я, возможно, делаю неправильно?

+0

Я думаю, что обнаружил хотя бы одну проблему: «mtcars» находится в другой среде и поэтому не может быть найден mget. теперь и с unlist(), похоже, это работает. благодаря! – mariego

ответ

2

Почему бы не использовать MGET и lapply:

lapply(mget(as.character(data[,1])), function(x) sum(is.na(x))) 

Вы не должны as.numeric при подведении логических выражений, хотя использование unlist или as.vector может помочь:

lapply(mget(as.character(data[,1])), function(x) sum(is.infinite(unlist(x)))) 

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

+0

Должен быть 'as.character (data [, 1])' вместо 'as.character (data [1])'. Кроме того, сначала будет отображаться таблица как список, чтобы обеспечить большую гибкость при применении разных вычислений. –

+0

Нет, на самом деле данные [, 1] и данные [1] одинаковы для данных. Я думаю, что 'mget' (а также' lapply') возвращает списки, поэтому я не понимаю другую часть вашего предложения. Подожди. Может быть, вы предлагаете нам присваивать результаты «table_list»? –

+0

Я писал ответ и остановился, когда увидел твое сообщение. В любом случае, если я поместил df, например 'df <- data.frame (tablename = c (" iris "," mtcars "), avg_size = c (5000,13000))', 'as.character (df [, 1]) 'возвращает' [1] "iris" "mtcars" ', а' as.character (df [1]) 'возвращает' [1] "1: 2" '. Не могу понять, почему тоже ... –

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