我是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列,我正在寻找更节省时间的方法。
答案 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)))