读取csv文件,在一列中包含数字和字符串

时间:2011-10-30 19:41:46

标签: r csv

我正在导入3列CSV文件。最后一列是一系列条目,可以是整数,也可以是引号中的字符串。

以下是一系列示例条目:

1,4,"m"
1,5,20
1,6,"Canada"
1,7,4
1,8,5

当我使用read.csv导入它时,这些都只是转入因子。

如何设置它们以便将它们作为整数和字符串读取?

谢谢!

3 个答案:

答案 0 :(得分:9)

这是不可能的,因为给定的向量只能有一种模式(例如characternumericlogical)。

但是,您可以将矢量分成两个单独的矢量,一个带有数值,另一个带有字符值:

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)

没有。数据帧是一系列粘贴在一起的向量(向量或矩阵列表)。因为每列都是向量,所以不能将其归类为整数和因子。它必须是一个或另一个。您可以将矢量拆分为数字和因子(每个的列),但我不相信这是你想要的。