【发布时间】:2014-07-06 04:31:38
【问题描述】:
我有一个包含 2 列的数据框,filename 和 monitorid。
filename monitorid
1 001.csv 1
2 002.csv 2
3 003.csv 3
4 004.csv 4
5 005.csv 5
6 006.csv 6
我正在尝试进行子集化以便为给定的 monitorid 选择 filename
filename <- files[files$monitorid==3,1]
我希望这会返回“003.csv”
Instread 它返回
[1] 003.csv
6 Levels: 001.csv 002.csv 003.csv 004.csv 005.csv 006.csv
然而
filename <- files[files$monitorid==3,2] returns
[1] 3
如预期的那样
我不明白为什么选择第 1 列会返回具有多个级别的因子,而第 2 列会返回单个值。
任何想法将不胜感激。
@KenM 这是我用来读取文件名的函数
getfileinfo <- function (directory){
## Reads file names into filenames variable
filenames <- list.files (path = directory)
## assigns monitorids to each file name
monitorid <- as.numeric(substr(filenames,1,3))
##combines filenames and monitorid into data frame, files
files <- data.frame(filenames, monitorid)
names(files) <- c("filename","monitorid")
return(files)
}
解决方案
这是每行的输出
filenames <- list.files (path = directory)
class(filenames)
[1] "character"
monitorid <- as.numeric(substr(filenames,1,3))
class(monitorid)
[1] "numeric"
files <- data.frame(filenames, monitorid)
sapply (files, class)
filenames monitorid
"factor" "numeric"
正如 KenM 和 BeginneR 所指出的,当组合成一个数据框时,字符向量文件名成为数据类因子的一列
更正的代码
files <- data.frame(filenames, monitorid, stringsAsFactors = FALSE)
sapply (files, class)
filenames monitorid
"character" "numeric"
【问题讨论】:
-
它返回正确的输出(
003.csv),但由于它是factor,它为您提供了有关现有因子水平的更多信息。当你读入你的数据时,你也可以使用stringsAsFactors=FALSE来避免因素(这些因素将被视为字符)。 -
感谢您的建议@beginneR。这正是我所需要的。