【发布时间】:2014-08-27 08:17:49
【问题描述】:
我有一个数据框,它有一列,一列有一些数据和一些空单元格。 当我检查该列的级别时,它显示三个级别,因为它将空单元格作为一个级别。我想删除那个级别。 假设我有
df <- data.frame(fan = c("a","b"," ","a","b"))
我试过这个代码
droplevels(df)
但它不起作用。
【问题讨论】:
标签: r
我有一个数据框,它有一列,一列有一些数据和一些空单元格。 当我检查该列的级别时,它显示三个级别,因为它将空单元格作为一个级别。我想删除那个级别。 假设我有
df <- data.frame(fan = c("a","b"," ","a","b"))
我试过这个代码
droplevels(df)
但它不起作用。
【问题讨论】:
标签: r
试试:
df$fan[grepl("^\\s*$", df$fan)] <- NA #in case you have c(" ", "", "a", "b", " ")
^(|\\s+)$- 匹配空引号'' 或引号(" ", " ", " ") 中的空格。因此,更笼统。
str(droplevels(df))
#'data.frame': 5 obs. of 1 variable:
#$ fan: Factor w/ 2 levels "a","b": 1 2 NA 1 2
如果你想创建一个删除空单元格的新数据集
df1 <- droplevels(df[!grepl("^\\s*$", df$fan),,drop=FALSE] )
str(df1)
#'data.frame': 4 obs. of 1 variable:
#$ fan: Factor w/ 2 levels "a","b": 1 2 1 2
【讨论】:
\\s* 会比 (|\\s+) 简单
'droplevels' 确实有效。无需复杂代码:
df <- data.frame(fan = c("a","b"," ","a","b"))
df
# fan
#1 a
#2 b
#3
#4 a
#5 b
df$fan[df$fan==' ']=NA
df$fan = droplevels(df$fan)
str(df)
#'data.frame': 5 obs. of 1 variable:
# $ fan: Factor w/ 2 levels "a","b": 1 2 NA 1 2
【讨论】:
如果您使用的是 csv,这可能会有所帮助:
data<-read.csv(file = "data.csv", na.strings = "", stringsAsFactors = T)
我修改了之前的回复,添加了, stringsAsFactors = T
所以,以后它不会像Createtableone那样在任何后续分析中报告NA
【讨论】:
当您将文件读入 R 时,您可以通过在 read.csv(或 read.xxx)中使用 na.strings 参数首先避免将“空单元格”作为因子级别包含在内。 na.strings 参数定义“将被解释为 NA 值的字符串”。
这是一个示例,其中我读取了我从您的“df”创建的文本文件 (foo.csv):
read.csv(file = "foo.csv", na.strings = " ")
# fan
# 1 a
# 2 b
# 3 <NA>
# 4 a
# 5 b
str(as.factor(df2$fan))
# Factor w/ 2 levels "a","b": 1 2 NA 1 2
读取文件时,空字段现在被视为NA,因此“空白”不包含在因子级别中。
来自?read.table:“空白字段 [...] 被认为是逻辑、整数、数字和复杂字段中的缺失值”。但是,在您的数据中,变量“fan”是character。如果您在options 或read.xxx 中有stringsAsFactors = TRUE,则character 向量将转换为factor。
【讨论】: