我正在导入3列CSV文件.最后一列是一系列条目,可以是整数,也可以是引号中的字符串.
以下是一系列示例条目:
1,4,"m"
1,5,20
1,6,"Canada"
1,7,4
1,8,5
Run Code Online (Sandbox Code Playgroud)
当我使用read.csv导入它时,这些都只是转入因子.
如何设置它们以便将它们作为整数和字符串读取?
谢谢!
这是不可能的,因为给定的载体可以仅具有单一模式(例如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
Run Code Online (Sandbox Code Playgroud)
编辑 尽管OP决定接受这个答案,@ Andrie的答案是首选的解决方案.我的回答只是为了告知数据帧的一些奇怪特征.
正如其他人所指出的那样,简短的回答是这是不可能的.data.frames旨在包含单个原子类型的列.@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
Run Code Online (Sandbox Code Playgroud)
现在,有很多理由说明这是一个坏主意.首先,你希望与data.frames 很好地配合使用的许多代码都不会喜欢这个并且要么失败,要么表现得非常奇怪.但我想我会把它作为一种好奇心来指出.