我编写了一个函数,该函数创建了一个列为"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, ]
这对matrix
和data.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, ]