r - 将每个数据框行文本分成五个均匀的文本 block

标签 r dataframe

我希望得到一些帮助来解决这个棘手的字符串问题。

当前数据框

ID  Text
1   This is a very long piece of string. This contains many lines.

我想将其转换为:

ID   Text1            Text2            Text3           Text4         Text5
1    This is a        very long piece  of string.      This contains  many lines. 

字符串拆分应该发生在均匀拼接的单词数量上。在上面的示例中,我试图演示将行平均拆分 5 次,因此每列应包含 20% 的单词。

这背后的目标是将这些词构建成这样一种方式,即当对话刚刚被拆分时,它们可以被视为时间序列数据。

最佳答案

可能有更好的选择,但这不需要额外的包:

首先,我们创建一个 reproducible example :

df <- data.frame(ID=1:2,
                 Text=c("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
                        "Lorem ipsum dolor sit amet, consectetur adipiscing elit"),
                 stringsAsFactors = FALSE)

然后,chunkizesplit+cut 的包装器,这是棘手的部分。它需要一个 character,将其按空格分割成 n block ,然后返回一个 data.framen许多专栏。 (我们删除了 names,这样 rbind 向下就可以了)。

chunkize <- function(chr, n=5){
  x <- strsplit(chr, " ")[[1]]
  df <- as.data.frame(
    lapply(
      split(x, 
            cut(seq_along(x), 
                breaks=n)), 
      paste, collapse=" "), 
    stringsAsFactors = FALSE, col.names=NULL)
  names(df) <- NULL
  df
}

然后我们简单地将它应用于每一行。我们还添加了 ID 列:

df_chunked <- do.call("rbind", 
                      apply(df, 1, 
                         function(x) cbind(x[1], chunkize(x[-1], 5))))

最后,我们重命名列:

colnames(df_chunked) <- c("ID", paste0("Text", 1:5))

将同样的事情变成一个方便的函数:

chunkize_this <- function(df, n=5){
  chunkize <- function(chr, n){
    x <- strsplit(chr, " ")[[1]]
    df <- as.data.frame(
      lapply(
        split(x, 
              cut(seq_along(x), 
                  breaks=n)), 
        paste, collapse=" "), 
      stringsAsFactors = FALSE, col.names=NULL)
    names(df) <- NULL
    df
  }

  df_chunked <- do.call("rbind", 
                        apply(df, 1, function(x) cbind(x[1], chunkize(x[-1], n))))
  colnames(df_chunked) <- c(colnames(df)[1], paste0("Text", 1:n))
  rownames(df_chunked) <- NULL
  df_chunked
}

你可以试试:

View(chunkize_this(df, 3))
View(chunkize_this(df, 5))

另一个例子:

df <- read.table(h=T, text=
  'ID   Text
  1    "This is a very long piece of string. This contains many lines."
  2    "This is a very long piece of string. It contains one or two more word."
  3    "Short"'
)

> chunkize_this(df, 5)
ID     Text1           Text2         Text3           Text4                Text5
1  1 This is a       very long      piece of    string. This contains many lines.
2  2 This is a very long piece of string. It contains one or       two more word.
3  3                                   Short                                     

关于r - 将每个数据框行文本分成五个均匀的文本 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46502534/

相关文章:

r - 如何在条形图中绘制特征的平均值?

r - 如何在 ggplot2 中制作 x 轴和 y 轴之间的间隙以及突出的刻度线

python - Pandas 检测过日日期

python - Pandas :在一列中找到最小值,将包含该列的行写入新数据框

r - Ubuntu 18.04 RJDBC :JDBC connection to oracle hangs no response

r - 修复多个警告 "unknown column"

r - 通过正则表达式添加 data.table 的列

python - 将 Dask DataFrame 存储为 pickle

r - 如何在 R 中获得 df 的前 100 个唯一位置?

python - 从 Polars 数据框中删除非 ASCII 字符