如果件数可变 data.frame,则拆分列

split column if variable number of pieces data.frame

我想根据“_”拆分下面 df 的第 y 列,但我的数据不完整。 (df 只是更大的 data.frame 的代表性部分)。

df <- data.frame(x = 1:10,
                 y = c("vuh_ftu_yefq", "sos_nvtspb", "pfymm_ucms",
                       "tucbexcqzh", "n_zndbhoun", "wdetzaolvn",
                       "lvohrpdqns", "wso_bsqwvr", "wx_gbkbxjl",
                       "t_dbxkkvge"))

我试过使用:

df$z <- strsplit(df$y,'_')

但是我得到一个错误,因为每个列表中的碎片数量不同。

我该怎么做?

您可以使用 tidyr 中的 separate 函数。

# required package
require(tidyr)
# separate (removing the y column)
separate(df, y, paste0("z", 1:3), sep = "_", extra = "merge")
# separate without removing the y column
separate(df, y, paste0("z", 1:3), sep = "_", extra = "merge", remove = FALSE)

假设:

  • ) 需要在您的示例中关闭 df。
  • incomplete data 表示它从左侧填充,这样一个没有插入 '_' 的值是第一个或数据。

tidyrseparate():

result <- separate(df, y, into = c("z1","z2","z3") , sep ='_', extra = "drop")
  • 这里的关键是 extra = "drop",根据文档 总是 returns 长度(成)片,根据需要删除或扩展

data.tabletstrsplit()

DT <- as.data.table(df)
result <- DT[, c("z1", "z2","z3") := tstrsplit(y, '_', fixed=TRUE)][]
  • tstrsplit() 的默认行为会满足您的需要,fixed=TRUE 会传递给下面的 strsplit() 以保持仓促。

注意:如果你的不完整数据是从右边填充的,你需要在这里取消你的变量!!!