【问题标题】:How to access data of a data.frame when the name of the data.frame is saved in a data.frame?当data.frame的名称保存在data.frame中时,如何访问data.frame的数据?
【发布时间】:2016-05-20 08:02:41
【问题描述】:

我对 R 很陌生,这个问题可能听起来很奇怪。我有一个 data.frame,第一列中有其他 data.frames 的名称:

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

然后我想做的是获取表的名称(那些是 data.frames)并在这些 data.frames 上运行一些函数。例如,我想获得每个表中 NA 的总和,这可以使用

    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”没有帮助。

有人可以帮忙吗?

编辑: 感谢您到目前为止的答案!我都试过了

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

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

但它返回“错误:''ttest'' 的值未找到。” 由于此解决方案似乎对您有用,我可能做错了什么?

【问题讨论】:

  • 我想我至少检测到一个问题,“mtcars”在不同的环境中,因此无法被 mget 找到。现在和 unlist() 它似乎工作。谢谢!

标签: r dataframe


【解决方案1】:

为什么不使用 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))) )

我把 as.character 放在那里是为了避免将字符输入作为因子的默认解释可能出现的问题。

【讨论】:

  • 应该是as.character(data[,1]) 而不是as.character(data[1])。还将首先将所有表格作为列表获取,以便更灵活地应用不同的计算。
  • 不,实际上 data[,1] 和 data[1] 对于数据帧是相同的。我认为mget(以及lapply)返回列表,所以我不明白你建议的另一部分。等一下。也许您是在建议我们将结果分配给“table_list”?
  • 我正在写一个答案,当我看到你的帖子时停了下来。无论如何,如果我放一个像df &lt;- data.frame(tablename=c("iris", "mtcars"), avg_size=c(5000,13000)) 这样的df,as.character(df[,1]) 返回[1] "iris" "mtcars",而as.character(df[1]) 返回[1] "1:2"。也不知道为什么……
  • 至于第二个建议,最好有一个列表,比如obg &lt;- lapply(as.character(df[,1]), get),然后与lapply(lapply(obg, is.na), sum) 相加。
  • 啊。 df[1] 将该列作为列表返回,而 df[,1] 删除维度并仅获得一个“向量”,尽管可能是一个因子变量。 as.character(df[1]) 没有正确地将列表中的一个因素强制转换为“字符”模式。你是对的,这将在你的方法中更好地工作。
猜你喜欢
  • 2012-01-10
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 2020-03-21
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多