0

我在 R 中索引 data.frames 时遇到了一些问题。我是 R 初学者。我有一个data.frame调用d,它有 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) <- NULL但我变得很偏执。任何人都可以帮助解决此错误消息的含义吗?

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

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

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

对于任何可以告诉我一个命令来查找 data.frame 的形状而不是查询其行名和列名的长度的人来说,PS 奖金真棒。

编辑:这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
4

2 回答 2

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值。

于 2010-03-03T21:34:18.440 回答
1

对于奖励 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
于 2010-03-03T21:40:19.560 回答