我正在导入3列CSV文件。最后一列是一系列条目,可以是整数,也可以是引号中的字符串。
以下是一系列示例条目:
1,4,"m"
1,5,20
1,6,"Canada"
1,7,4
1,8,5
当我使用read.csv导入它时,这些都只是转入因子。
如何设置它们以便将它们作为整数和字符串读取?
谢谢!
答案 0 :(得分:9)
这是不可能的,因为给定的向量只能有一种模式(例如character
,numeric
或logical
)。
但是,您可以将矢量分成两个单独的矢量,一个带有数值,另一个带有字符值:
vec <- c("m", 20, "Canada", 4, 5)
vnum <- as.numeric(vec)
vchar <- ifelse(is.na(vnum), vec, NA)
vnum
[1] NA 20 NA 4 5
vchar
[1] "m" NA "Canada" NA NA
答案 1 :(得分:6)
编辑 尽管OP决定接受这个答案,@ Andrie的回答是首选解决方案。我的回答只是为了告知数据帧的一些奇怪特征。
正如其他人所指出的那样,简短的回答是这是不可能的。 data.frame
旨在包含单个原子类型的列。 @Andrie的建议很好,但只是为了踢,我想我会指出一种方法将这类数据卖给data.frame
。
您可以将违规列转换为列表(此代码假设您已设置options(stringsAsFactors = FALSE)
):
dat <- read.table(textConnection("1,4,'m'
1,5,20
1,6,'Canada'
1,7,4
1,8,5"),header = FALSE,sep = ",")
tmp <- as.list(as.numeric(dat$V3))
tmp[c(1,3)] <- dat$V3[c(1,3)]
dat$V3 <- tmp
str(dat)
'data.frame': 5 obs. of 3 variables:
$ V1: int 1 1 1 1 1
$ V2: int 4 5 6 7 8
$ V3:List of 5
..$ : chr "m"
..$ : num 20
..$ : chr "Canada"
..$ : num 4
..$ : num 5
现在,为什么这是一个坏主意有各种各样的原因。首先,许多你期望与data.frame
完美搭配的代码都不会喜欢这个并且要么失败,要么表现得非常奇怪。但我以为我会把它作为一种好奇心来指出。
答案 2 :(得分:2)
没有。数据帧是一系列粘贴在一起的向量(向量或矩阵列表)。因为每列都是向量,所以不能将其归类为整数和因子。它必须是一个或另一个。您可以将矢量拆分为数字和因子(每个的列),但我不相信这是你想要的。