R:由函数基于列值使用大于生成的数据帧中的子集行



我编写了一个函数,该函数创建了一个列为"id"one_answers"vec"的数据帧,然后将其分配给t1。

我试图通过选择"vec"值仅大于200的行来对df进行子集划分,并将其分配给t2,但当我使用t2<-时,似乎什么都没有发生t1["vec">200,]并且它不允许我使用$选择器(出现错误$运算符对原子向量无效(。如果有任何帮助,我将不胜感激!

#this function takes file numbers given in id and creates a table with file number ('id') and number of complete cases ('vec')
complete <- function(id=1:332){
vec <- c()
for (i in id){
file_names <- dir() 
your_data_frame <- do.call(rbind,lapply(file_names[i],read.csv, header=TRUE))
comp = sum(complete.cases(your_data_frame))
vec <- c(vec, comp)
}
df <- c()
df = cbind(df, id, vec)
return(df)
}

#create df with rows that have a 'vec' value greater than 200
t1 <- complete()
t2 <- t1["vec" > 199,]

试试这个:

t2 <- t1[t1[, "vec"] > 199, ]

这对matrixdata.frame都有效。

与您在问题中所写的相反,t1的数据类型是matrix(通过调用class(t1)可以看到(,而不是data.frame。当您将向量集合cbind放在一起时,您将得到一个matrix

没有任何方法可以像t1$name那样通过维度名称索引到matrix中(这就是出现错误的原因(。

你可以用t1 <- data.frame(t1)t1变成data.frame,这样你就可以使用类似t1[t1$vec > 199, ]的东西。

否则,如果你不改变t1的类型,你会这样做:

t1[t1[,1] > 199,]

t1[t1[,"vec"] > 199,]

另一种方法是将t1转换为dplyr::data_frame,并使用诸如dplyr::filter():之类的过滤

library(dplyr)
dplyr::as_data_frame(t1) %>% dplyr::filter(vec > 199)

感谢大家的回复!BrianLang-我在complete((函数中添加了df<-data.frame(df)行,然后用t2<-t1[t1[,"vec"] > 199,]替换了代码的最后一行,这就成功了!

对我的问题中的错误假设/缺乏数据表示歉意,我是R的新手!

如果你想要大于199的,请使用这个

t2 <- t1 %>% t[t$vec > 199, ]

最新更新