【问题标题】:Multiple Separators for the same file input R同一文件输入 R 的多个分隔符
【发布时间】:2013-12-03 05:13:16
【问题描述】:

我已经寻找答案,但只找到了涉及 C 或 C# 的内容。 我意识到 R 的大部分内容是用 C 编写的,但我对此一无所知。 我对 R 也比较陌生。 我正在使用当前的 Rstudio。

这与我想要的相似,我想。 Read the data efficiently with multiple separating lines in R

我有一个 csv 文件,但一个变量是一个字符串,其值由 _- 分隔 而且我想知道是否有一个包或额外的代码在读取时执行以下操作。命令。

"1","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_ANDROID","2013-08-31 13:39:55.0","2013-10-16 13:58:00.0",0,218,4,93,1377907200000
"2","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_ANDROID","2013-08-31 13:39:55.0","2013-10-16 13:58:00.0",0,390,5,157,1377993600000
"3","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_ANDROID","2013-08-31 13:39:55.0","2013-10-16 13:58:00.0",0,376,5,193,1.37808e+12
"4","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_ANDROID","2013-08-31 13:39:55.0","2013-10-16 13:58:00.0",1,35,1,15,1377907200000
"5","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_ANDROID","2013-08-31 13:39:55.0","2013-10-16 13:58:00.0",12,11258,117,2843,1377993600000
"6","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_ANDROID","2013-08-31 13:39:55.0","2013-10-16 13:58:00.0",5,4659,56,1826,1.37808e+12
"7","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_ANDROID","2013-08-31 13:39:55.0","2013-10-16 13:58:00.0",7,7296,136,2684,1377907200000
"8","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_IOS_IPAD","2013-08-31 13:18:21.0","2013-10-16 13:58:00.0",0,4533,35,1632,1377907200000
"9","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_IOS_IPAD","2013-08-31 13:18:21.0","2013-10-16 13:58:00.0",0,421,6,161,1377993600000
"10","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_IOS_IPAD","2013-08-31 13:18:21.0","2013-10-16 13:58:00.0",0,57,2,23,1.37808e+12

示例行:

Name    Name1   *XYZ_Name3_KB_MobApp_M-18-25_AU_PI ANDROID  2013-09-32 14:39:55.0   2013-10-16 13:58:00.0   0   218 4   93  1377907200000

所以阅读起来很容易

results <- read.delim("~/results", header=F)

但我仍然有字符串 *XYZ_Name3_KB_MobApp_M-18-25_AU_PI

所需的输出(由_- 分隔):

Name    Name1   *XYZ   Name3  KB   MobApp   M 18 25  AU  PI ANDROID 2013-09-32 14:39:55.0   2013-10-16 13:58:00.0   0   218 4   93  1377907200000

但不拆分时间字符串。

---- 感谢@Henrik 和@AnandaMahto 提供代码和包。 ----

library(splitstackshape)

# split concatenated column by `_`
df4 <- concat.split(data = df3, split.col = "V3", sep = "_", drop = TRUE)

# split the remaining concatenated part by `-`
df5 <- concat.split(data = df4, split.col = "V3_5", sep = "-", drop = TRUE)

【问题讨论】:

  • 我可以选择再次导出到 csv,然后放入 excel 并使用文本到列两次。但由于我使用的是 excel 2010,它的行数有限。
  • 看看str_splitstringr::str_split_fixed 看看是否有帮助。
  • 啊,这么简单。你认为我应该分多个步骤来做吗?而不是导入。
  • 我会在导入后立即执行。我将在下面发布 sn-p。
  • 您可以使用正则表达式和 | 在 strsplit 中指定多个拆分字符。运算符,例如 strsplit("*XYZ_Name3_KB_MobApp_M-18-25_AU_PI ANDROID",split="\_|\\-")

标签: r csv import delimiter separator


【解决方案1】:

我发现 splitstackshape 包中的函数在这种情况下很方便。

library(splitstackshape)

# split concatenated column by `_`
results2 <- concat.split(data = results, split.col = "V3", sep = "_", drop = TRUE)

# split the remaining concatenated part by `-`
results3 <- concat.split(data = results2, split.col = "V3_5", sep = "-", drop = TRUE)
results3

【讨论】:

  • 我收到“FUN 中的错误(NA_integer_[[1L]], ...) :参数必须强制转换为非负整数”但感谢您提供的软件包让它发挥作用。
  • 好的。可能您的原始数据的某些特征未在您的问题的小样本中表示(对我来说效果很好)。干杯。
  • @ChristianArnold,作为包的作者,我有兴趣查看一些导致此错误的实际数据以及重现它的步骤。请随时通过creating an issue at the package's Github issue tracker 这样做。谢谢!
【解决方案2】:

试试这个:

# dummy data
df <- read.table(text="
Name    Name1   *XYZ_Name3_KB_MobApp_M-18-25_AU_PI ANDROID  2013-09-32 14:39:55.0   2013-10-16 13:58:00.0   0   218 4   93  1377907200000
Name    Name2   *CCC_Name3_KB_MobApp_M-18-25_AU_PI ANDROID  2013-09-32 14:39:55.0   2013-10-16 13:58:00.0   0   218 4   93  1377907200000
", as.is = TRUE)

# replace "_" to "-"
df_V3 <- gsub(pattern="_", replacement="-", df$V3, fixed = TRUE)

# strsplit, make dataframe
df_V3 <- do.call(rbind.data.frame, strsplit(df_V3, split = "-"))

# output, merge columns
output <- cbind(df[, c(1:2)],
                df_V3,
                df[, c(4:ncol(df))])

在下面的 cmets 的基础上,这是另一个相关选项,但它使用 read.table 而不是 strsplit

splitCol <- "V3"
temp <- read.table(text = gsub("-", "_", df[, splitCol]), sep = "_")
names(temp) <- paste(splitCol, seq_along(temp), sep = "_")
cbind(df[setdiff(names(df), splitCol)], temp)

【讨论】:

  • @zx8754,两个想法:(1)如果你要使用strsplit方法,使用正则表达式并跳过gsub这一步,也许只使用do.call(rbind, ...),因为(我认为rbind.data.frame 更慢(而且它给你的名字很时髦)。 (2) 如果你打算使用gsub 方法,忘记strsplit 并使用read.table(text = df_V3, sep = "-")
  • 但是 +1 的答案至少应该将 OP 指向正确的方向 ;-)
  • 如果我有足够的声望点,我会投票。但遗憾的是还没有。
  • @ChristianArnold,用一些可重复的数据和一些你尝试过的例子来编辑你的问题,人们肯定会对你的问题给予更多的支持,这反过来会让你投票关于答案;-)
  • @AnandaMahto 同意,代码有点混乱,目的是引导 OP 朝着正确的方向发展,请随时编辑。
【解决方案3】:
library(stringr)

results <- read.delim("~/results", header=F)
results <- cbind(results,str_split_fixed(results$V3, "[_-]", 9))

(假设您可以将原始列保留在原位)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 2013-08-13
    • 2021-12-17
    • 2020-06-28
    相关资源
    最近更新 更多