子集数据帧返回具有级别而不是单个值的因子

时间:2014-05-17 23:10:23

标签: r dataframe

我的数据框包含2列,filenamemonitorid

  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

我正在尝试分组,以便为​​给定的filename选择monitorid

filename <- files[files$monitorid==3,1]

我希望这会返回&#34; 003.csv&#34;

Instread it return

[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" 

1 个答案:

答案 0 :(得分:1)

  

我不明白为什么选择第1列会返回具有多个级别的因子,而第2列会返回单个值。

你得到因素,因为你加载了“filename”列作为因子,而(我想)你想要一个字符串/字符作为“filename”对象的值。

解决方案是: 1.加载csv文件时,请将值读取为字符而不是因子;要么 2.将因子转换为字符。

对于解决方案1,在colClasses = "character中设置read.csv()(请参阅?read.csv) 对于解决方案2,请执行filename <- as.character(files[files$monitorid==3,1])

(顺便说一句,请在提问时附上一个可重现的例子)