R - 在data.table中去除每个因子的第一个和最后一个字符

4

我刚接触R语言,有一个快速的问题: 如何最好地删除数据表中每个“单元格”的第一个和最后一个字符。我从一个.txt文件导入数据,其中文本有三个字符分隔符 - “^ | ^”?

DT <- fread("file.txt", header = T, sep= "|")

答案:

以下是删除数据表中每个“单元格”的第一个和最后一个字符的最佳方法:

DT[, lapply(.SD, function(x) substring(x, 2, nchar(x) - 1)), .SDcols = names(DT)]
  Row     Conc   group
  ^1^     ^2.5^    ^A^
  ^2^     ^3.0^    ^A^
  ^3^     ^4.6^    ^B^
  ^4^     ^5.0^    ^B^
  ^5^     ^3.2^    ^C^
  ^6^     ^4.2^    ^C^
  ^7^     ^5.3^    ^D^
  ^8^     ^3.4^    ^D^ 

使用stringi包,我可以逐列删除"^":

DT[, Row := stri_sub(Row,2,-2)]    

它将其转换为字符,但应该没问题。 然而,由于我正在使用的data.table有46列,我正在寻找更加高效的方法来完成它。


4
尝试使用DT[,lapply(.SD,function(x) substring(x,2,nchar(as.character(x))-1))]这个语句。 - nicola
这些是字符列,而不是因子,这要归功于fread如何使用其默认选项。这两种情况的答案是不同的。 - Frank
也许你可以尝试以不同的方式读取文件:DT <- fread("file.txt", header = T, sep= '^')[, !"|", with = FALSE] - J.R.
@J.R. 我已经尝试了你的方法。它去掉了“^”,但是“^”内的数字值已经改变了。 - Tsvetan Nikolov
3个回答

9
或者您可以继续您的方法:
library(data.table)
library(stringi)

cols <- names(df)
setDT(df)[, (cols) := lapply(.SD, function(x) stri_sub(x, 2, -2))]

如果您想将包含数字的列转换为适当的类型,您可以使用@Frank在评论中提供的代码:
setDT(df)[, (cols) := lapply(.SD, function(x) type.convert(stri_sub(x, 2, -2)))]

3

当我查看 DT 的内容时,它给我的印象就像 ^ 被用作引号一样。因此,如果你的输入文件看起来像:

Row|Conc|group
^1^|^2.5^|^A^
^2^|^3.0^|^A^
...

您可以尝试在 fread 中使用 quote 参数:
DT <- fread("file.txt", header = TRUE, sep= "|", quote = "^")

这里有一个可重现的例子,其中文件名被假定为文件内容(前三行)替换了。

fread("
Row|Conc|group
^1^|^2.5^|^A^
^2^|^3.0^|^A^",
header = TRUE, sep= "|", quote = "^")

返回优雅

   Row Conc group
1:   1  2.5     A
2:   2  3.0     A

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Tsvetan Nikolov
我正在使用: [1] data.table_1.9.6 - Tsvetan Nikolov
抱歉,我忘了提到我使用的是 data.table 的 v.1.9.7 版本。很高兴听到这也适用于 read.table - Uwe

2

1) 你可以尝试只替换 "^":

final <- as.data.frame(apply(DT, 2, function(y) gsub("^", "", y, fixed = T)))

2) 要删除第一个和最后一个字符,您可以使用str_sub和apply:

final <- as.data.frame(apply(DT, 2, function(y) str_sub(y, 2, str_length(y)-1)))

不建议在data.framedata.table中使用apply(请参见http://stackoverflow.com/a/37828523/3817004)。最好使用`lapply`。在这里,`apply`会将其转换为矩阵,然后再强制转换回数据框,这并不直观。 - Uwe

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