【问题标题】:subset data frame returns factor with level instead of single value子集数据框返回具有级别而不是单个值的因子
【发布时间】:2014-07-06 04:31:38
【问题描述】:

我有一个包含 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

我正在尝试进行子集化以便为给定的 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。这正是我所需要的。

标签: r dataframe


【解决方案1】:

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

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

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

对于解决方案1,将colClasses = "character设置为read.csv()(参见?read.csv) 对于解决方案2,请执行filename &lt;- as.character(files[files$monitorid==3,1])

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

【讨论】:

    猜你喜欢
    • 2014-02-11
    • 2021-06-10
    • 1970-01-01
    • 2018-11-02
    • 2019-01-27
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    相关资源
    最近更新 更多