【问题标题】:Indexing data.frames using arrays of TRUEs and FALSEs使用 TRUE 和 FALSE 数组索引 data.frames
【发布时间】:2011-01-23 09:57:18
【问题描述】:

我在 R 中索引 data.frames 时遇到了一些问题。我是 R 初学者。我有一个名为ddata.frame,它有35512 列和77 行。我有一个名为 rd 的列表,其中包含 35512 个元素。我希望d 的所有列对应于rd 中的项目小于100。这就是我正在做的事情:

# just to prove I'm not crazy
> length(colnames(d))
[1] 35512
> length(rownames(d))
[1] 77
> length(rd)
[1] 35512
# find all the elements of rd less than 100 (+ unnecessary faffing?)
> i <- unlist(rd<100)
> names(i) <- NULL
# try to extract all the elements of d corresponding to rd < 100
> d <- d[,i]
Error in `[.data.frame`(d, , i) : undefined columns selected

我真的不想做unlistnames(i) &lt;- NULL 的事情,但我越来越偏执了。谁能帮忙看看这个错误信息到底意味着什么?

如果有帮助,rd 变量是使用以下内容创建的:

rd = lapply(lapply(d, range), diff)

希望能告诉我d 每一列范围的差异。

附:任何能告诉我一个命令来查找 data.frame 的形状而不是查询其行名和列名的长度的人都将获得额外的奖励。

编辑:这是rd 的样子:

> rd[1:3]
$`10338001`
[1] 7198.886

$`10338003`
[1] 4748.963

$`10338004`
[1] 3173.046

当我完成我的工作后,i 看起来像这样:

> i[7:10]
[1] FALSE FALSE FALSE  TRUE

【问题讨论】:

  • i 的长度是多少?确认这是真的:length(i) == ncol(d)。另外,检查您是否在 i 中有任何 NA。 any(is.na(i)) 最后,检查is.logical(i)
  • 啊! any(is.na(i)) 返回TRUE。感谢您提供此线索!
  • 为什么有这么宽的data.frame?你确定你不想要一个长的 data.frame 吗?或者如果一切都是数字,只是一个矩阵?在内部,data.frames 是列向量列表,因此非常宽的 df 操作起来效率不高。
  • 嗨哈兰 - 经过几天我不熟练的黑客攻击后,我的 data.frame 只是以这种方式结束。我不知道内部表示,我想我已经习惯了 Python 中以行为中心的表示!将转置......这是一个data.frame而不是矩阵,因为那里有一些因素,直到我决定对每列的范围感兴趣。本质上这里没有设计。我只是跟着粉笔......

标签: r indexing dataframe shape logical-operators


【解决方案1】:

你试过了吗:

d[,rd < 100]

这是一个独立的例子:

d <- data.frame(matrix(1:100, ncol=10))
rd <- as.list(1:10)
d[,rd < 5]

要获取数据框的形状,请使用nrowncol

编辑:

根据您对我的NA 问题的回答,听起来您的索引中有非逻辑值是由列表中的缺失值导致的。最好的办法是首先决定如何处理缺失值。然后使用is.na 函数处理它们(这里我从上面扩展我的示例):

rd[[3]] <- NA
d[,rd < 5]
# => Error in `[.data.frame`(d, , rd < 5) : undefined columns selected

为了解决这个问题,我将 NA 值设置为 0(这意味着相应的列将包含在最终的 data.frame 中):

rd[is.na(rd)] <- 0
d[,rd < 5]

您需要自行决定如何处理 NA 值。

【讨论】:

  • 是的!这就是我首先尝试的。我得到了同样的错误。那时我开始取消列出和删除名称等。 > d[,rd [.data.frame(d, , rd
  • 请为 rd 提供一小部分数据样本。
【解决方案2】:

对于奖励 Q,您可以使用“dim”命令获得数据框或矩阵的“形状”。

A = matrix( ceiling(10*runif(40)), nrow=8)
colnames(A) = c("col1", "col2", "col3", "col4", "col5")
df = data.frame(A)
b = ceiling(100*runif(5))

ndx = b < 50          
result = df[,ndx]     # just the columns of df corresponding to b < 50

【讨论】:

  • 感谢 'dim' 命令!我想我需要购买一些黄色弹簧
猜你喜欢
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 2021-12-25
  • 2010-11-30
相关资源
最近更新 更多