【问题标题】:Reading csv file, having numbers and strings in one column读取 csv 文件,在一列中包含数字和字符串
【发布时间】:2011-12-18 08:08:55
【问题描述】:

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

以下是一系列示例条目:

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

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

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

谢谢!

【问题讨论】:

  • 解决了我的问题。有点像你的。我的列包含带有字符串或整数的行,例如您的。字符串值被读取为 "" 并且整数被正确读取。当你像你一样在字符串周围和整数周围放置引号时,每个都是从 csv 中正确读取的。我仍然不确定这是什么原因,但似乎奏效了。

标签: r csv


【解决方案1】:

这是不可能的,因为给定的向量只能有一个模式(例如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      

【讨论】:

  • 安德烈你和我说的一样,但更好。
  • @user718281,读取为字符串,而不是因子,使用 read.csv(...,stringsAsFactors=FALSE)
  • 谢谢安德烈。我不太确定该怎么做的一件事是,我如何从 csv 文件转到向量。正如我的理解,read.csv 输出的是矩阵,而不是向量。
  • read.csv 输出data.frame。有几种方法可以索引 data.frame 的列(向量)。例如,按列号:dat[, 3]
  • 安德烈,抱歉我的无知,但这对我不起作用。当我在数据框中的一行上执行 as.numeric 时,它给了我每个因素的数字,而不是实际的整数。你知道我该如何解决这个问题吗?
【解决方案2】:

编辑 尽管 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

现在,有各种各样的原因表明这是一个坏主意。一方面,许多您希望与data.frames 很好地配合使用的代码不会像这样,要么失败,要么表现得非常奇怪。但我想我会出于好奇而指出这一点。

【讨论】:

  • 尽管如此残暴,但我正在讨论出现更糟糕的事情的道德规范。 :)
  • 嗯,实际上,这对我来说是不可重现的。 V3的值为5、1、4、2、3,类为int、num、int、num、num。分辨率:options(stringsAsFactors = FALSE).
  • @Iterator 谢谢你的提醒;在干净的 R 会话中编写 SO 答案时,我应该更加小心。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多