R数据框中的层级

7
我从一个 .csv 文件中导入了数据,并附加了数据集。
我的问题是:有一个变量是整数形式的,有 295 个级别。我需要使用这个变量来创建其他变量,但我不知道如何处理这些级别。
这些是什么,我该怎么处理它们?

这可能意味着几件事情,这取决于您所说的“级别”的含义。这听起来有点像您的数字已被转换为因子变量,因为某个地方存在格式不正确的数字,因此R将其全部转换为分类“因子”变量。请问您能否在此剪切粘贴精确的代码和错误信息? - Spacedman
你读过 ?factor 吗?或者 ?levels - Marek
setwd("D:/users/me/Desktop") data <- read.csv("Rdata.csv") attach(data) ctr <- for (i in 1:4722) {as.integer(a[i]/b[i])} - Thomas
1:在Ops.factor(a[i], b[i])中: /不适用于因子 - Thomas
4个回答

8

当您使用read.table(或read.csv?-您没有指定)读取数据时,请添加参数stringsAsFactors = FALSE。然后,您将获得字符数据。

如果您期望该列的数据为整数,则必须有不可解释为整数的数据,因此在读取后请转换为数字。

txt <- c("x,y,z", "1,2,3", "a,b,c")

d <- read.csv(textConnection(txt))
sapply(d, class)
       x        y        z 
##"factor" "factor" "factor" 

## we don't want factors, but characters
d <- read.csv(textConnection(txt), stringsAsFactors = FALSE)
sapply(d, class)

#          x           y           z 
#"character" "character" "character" 

## convert x to numeric, and wear NAs for non numeric data
as.numeric(d$x)

#[1]  1 NA
#Warning message:
#NAs introduced by coercion 

最后,如果您想忽略这些输入细节并从因子中提取整数级别,可以使用例如 as.numeric(levels(d$x))[d$x],具体请参见 ?factor 中的“警告”。


感谢您的指导! - Michael Pell

5
或者你可以简单地使用 d$x2 = as.numeric(as.character(d$x))

4
根据您的说明,我建议您使用read.table并设置header=TRUE、stringAsFactors=FALSE和as.is=!stringsAsFactors以及sep=","重新编写读取语句:
datinp <- read.table("Rdata.csv", header=TRUE, stringAsFactors=FALSE , 
                       as.is = !stringsAsFactors , sep=",") 
datinp$a <- as.numeric(datinp$a)
datinp$b <- as.numeric(datinp$b)
datinp$ctr <- with(datinp, as.integer(a/b) ) # no loop needed when using vector arithmetic

1

执行summary(data)检查读入的数据是否正确。如果某些列不是数字,可以查看read.csv函数中的colClasses参数进行强制转换,这可能会导致一些格式不正确的数字变成NA值。

使用help(read.csv)获取更多帮助信息。


Spacedman:你能否使用colClasses强制使用NA?一开始我也这么想,但是txt <- c("x,y,z", "1,2,3", "a,b,c", "1,2,3"); d <- read.table(textConnection(txt), sep = ",", header = TRUE, colClasses = rep("numeric", 3))在扫描时出现错误。在read.table中是否有我忽略的内容? - mdsumner
@mdsummer:去掉那些双引号。它们会把你的字符捆绑在一起,这不是你想要的方式。 - IRTFM
@mdsummer:但问题仍然存在。需要使用as.is=TRUE。 - IRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接