使用TRUE和FALSE数组索引data.frames

时间:2010-03-03 21:04:15

标签: r indexing dataframe shape logical-operators

我在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每列的范围不同。

P.S。对于任何能告诉我命令来查找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

2 个答案:

答案 0 :(得分: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值。

答案 1 :(得分: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