作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题在这里已经有了答案:
How to strsplit different number of strings in certain column by do function
(1 个回答)
4年前关闭。
也许我想做的事情是不可能的,所以我提出了这个问题来知道是否有办法。
看完这篇 question在stackoverflow中,我看到有一种方法可以将一列拆分为不同的列,但这不是我想要的,我有一个 Shiny 的应用程序,我可以在其中包含具有以下值的表:
Phones price
Nokia 1234D - J298 6732 - LM 2 103$
Samsung 3342L - J2YY 4372 - YU 3 130$
Samsung 3042X - IKAA 3221 - GN 4 102$
library(stringr)
c=c(" "," - "," "," - ")
mytable <-data.table(Phones=c("Nokia 1234D - J298 6732 - LM 2",
"Samsung 3342L - J2YY 4372 - YU 3",
"Samsung 3042X - IKAA 3221 - GN 4"),price= c("103$", "130$", "102$") )
aux = str_split_fixed(mytable$Phones, c, 5)
mytable<-data.table( aux, mytable$price)
V1 V2 V3 V4 V5 V2
1: Nokia 1234D - J298 6732 - LM 2 103$
2: Samsung 3342L J2YY 4372 YU 3 130$
3: Samsung 3042X - IKAA 3221 - GN 4 102$
4: Nokia 1234D J298 6732 LM 2 103$
最佳答案
我们可以 separate
将“电话”列分成 5 列,其中 extra= "merge"
将最后一列保留为字符串 "LM 2", "YU 3"
等等
library(tidyr)
library(dplyr)
mytable %>%
separate(Phones, into = paste0("V", 1:5), remove = FALSE, extra = "merge")
# Phones V1 V2 V3 V4 V5 price
#1: Nokia 1234D - J298 6732 - LM 2 Nokia 1234D J298 6732 LM 2 103$
#2: Samsung 3342L - J2YY 4372 - YU 3 Samsung 3342L J2YY 4372 YU 3 130$
#3: Samsung 3042X - IKAA 3221 - GN 4 Samsung 3042X IKAA 3221 GN 4 102$
extract
mytable %>%
extract(Phones, into = paste0("V", 1:4), remove = FALSE,
"^(\\w+\\s+\\w+)\\s*-\\s*(\\w+)\\s+(\\w+)\\s*-\\s*(\\w+\\s+\\w+)")
# Phones V1 V2 V3 V4 price
#1: Nokia 1234D - J298 6732 - LM 2 Nokia 1234D J298 6732 LM 2 103$
#2: Samsung 3342L - J2YY 4372 - YU 3 Samsung 3342L J2YY 4372 YU 3 130$
#3: Samsung 3042X - IKAA 3221 - GN 4 Samsung 3042X IKAA 3221 GN 4 102$
^
意味着字符串的开头,后跟单词(
\\w+
)后跟一个或多个空格(
\\s+
)和下一个单词(
\\w+
),我们将其作为一组(
(...)
)捕获,类似地,字符匹配基于单词,空格字符
library(stringr)
c <- c(" "," - "," "," - ") #it is better to avoid function names for object names
fsplit <- function(str1, splt) {
lst <- str_split(str1, splt, n = 2)
v1 <- sapply(lst, `[`, 1)
v2 <- sapply(lst, `[`, 2)
list(v1, v2)
}
mytable[, V5 := Phones]
nm1 <- paste0("V", seq_along(c))
for(i in seq_along(c)){
tmp <- fsplit(mytable$V5, c[i])
mytable[, (nm1[i]) := tmp[[1]]]
mytable[, V5 := tmp[[2]]][]
}
setcolorder(mytable, c("Phones", nm1, "V5", "price"))
mytable
# Phones V1 V2 V3 V4 V5 price
#1: Nokia 1234D - J298 6732 - LM 2 Nokia 1234D J298 6732 LM 2 103$
#2: Samsung 3342L - J2YY 4372 - YU 3 Samsung 3342L J2YY 4372 YU 3 130$
#3: Samsung 3042X - IKAA 3221 - GN 4 Samsung 3042X IKAA 3221 GN 4 102$
关于r - 给定分隔符的输入,将表的一列拆分为多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45835732/
我是一名优秀的程序员,十分优秀!