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

时间:2016-08-03 15:54:43

标签: r data.table

我是R的新手,我有以下快速提问: 删除data.table中每个“单元格”的第一个和最后一个字符的最佳方法是什么。我从.txt文件中导入了数据,其中文本有三个字符的分隔符 - “^ | ^”?

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

  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)]    

它将它转换为char,但那应该没问题。 但是,由于我使用的data.table有46列,我正在寻找更节省时间的方法。

3 个答案:

答案 0 :(得分: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)))]

答案 1 :(得分:2)

当我查看DT的内容时,我觉得好像^被用作引号。因此,如果您的输入文件看起来像

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

您可以尝试使用quote中的fread参数:

DT <- fread("file.txt", header = TRUE, sep= "|", quote = "^")

这是一个可重复的示例,其中文件名由文件的假定内容替换(好,前3行)

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

答案 2 :(得分:1)

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

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

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

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