作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望得到一些帮助来解决这个棘手的字符串问题。
当前数据框
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)
然后,chunkize
是 split
+cut
的包装器,这是棘手的部分。它需要一个 character
,将其按空格分割成 n
block ,然后返回一个 data.frame
和 n
许多专栏。 (我们删除了 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/
我是一名优秀的程序员,十分优秀!