我在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
我真的不想做unlist
和names(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
答案 0 :(得分:1)
你试过这个:
d[,rd < 100]
这是一个独立的例子:
d <- data.frame(matrix(1:100, ncol=10))
rd <- as.list(1:10)
d[,rd < 5]
要获取数据框的形状,请使用nrow
和ncol
。
编辑:
根据您对我的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