我有一个很大的数据集,我想阅读特定的列或放弃所有其他列。
data <- read.dta("file.dta")
我选择我不感兴趣的列:
var.out <- names(data)[!names(data) %in% c("iden", "name", "x_serv", "m_serv")]
然后我想做的事情是:
for(i in 1:length(var.out)) {
paste("data$", var.out[i], sep="") <- NULL
}
删除所有不需要的列。这是最优解吗?
不要使用-which(),这是极其危险的。考虑:
dat <- data.frame(x=1:5, y=2:6, z=3:7, u=4:8)
dat[ , -which(names(dat) %in% c("z","u"))] ## works as expected
dat[ , -which(names(dat) %in% c("foo","bar"))] ## deletes all columns! Probably not what you wanted...
使用子集或!功能:
dat[ , !names(dat) %in% c("z","u")] ## works as expected
dat[ , !names(dat) %in% c("foo","bar")] ## returns the un-altered data.frame. Probably what you want
我从痛苦的经历中学到了这一点。不要过度使用which()!
您应该使用索引或子集函数。例如:
R> df <- data.frame(x=1:5, y=2:6, z=3:7, u=4:8)
R> df
x y z u
1 1 2 3 4
2 2 3 4 5
3 3 4 5 6
4 4 5 6 7
5 5 6 7 8
然后你可以在列索引中使用which函数和-运算符:
R> df[ , -which(names(df) %in% c("z","u"))]
x y
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6
或者,更简单的是,使用子集函数的select参数:然后可以直接对列名向量使用-运算符,甚至可以省略列名周围的引号!
R> subset(df, select=-c(z,u))
x y
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6
注意,你也可以选择你想要的列,而不是删除其他列:
R> df[ , c("x","y")]
x y
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6
R> subset(df, select=c(x,y))
x y
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6
我不能在评论中回答你的问题,因为我的声誉评分很低。
下面的代码将给出一个错误,因为粘贴函数返回一个字符串
for(i in 1:length(var.out)) {
paste("data$", var.out[i], sep="") <- NULL
}
这里有一个可能的解决方案:
for(i in 1:length(var.out)) {
text_to_source <- paste0 ("data$", var.out[i], "<- NULL") # Write a line of your
# code like a character string
eval (parse (text=text_to_source)) # Source a text that contains a code
}
或者直接做:
for(i in 1:length(var.out)) {
data[var.out[i]] <- NULL
}