[英]In R ,how can I split one column to two columns? Thanks
有一个 data.frame 作为打击
myindex
234yua
1w
678tw@s
如何添加新列“mynumber”“mychart”。 希望的数据帧作为打击。
myindex mynumber mychart
234yua 234 yua
1w 1 w
678tw@s 678 tw@s
任何人都可以帮忙吗? 谢谢
这是否有效:
library(dplyr)
library(tidyr)
df %>% extract(col = myindex, into = c('mynumber','mychart'), regex = '(\\d+)([a-z]+[[:punct:]]?[a-z]?)', remove = F)
myindex mynumber mychart
1 234yua 234 yua
2 1w 1 w
3 678tw@s 678 tw@s
你也可以试试这个base R
解决方案:
#Code
mydf$mychart <- gsub("[[:digit:]]", "", mydf$myindex)
mydf$mynumber <- gsub("[^0-9.-]", "", mydf$myindex)
输出:
myindex mychart mynumber
1 234yua yua 234
2 1w w 1
3 678tw@s tw@s 678
使用的一些数据:
#Data
mydf <- structure(list(myindex = c("234yua", "1w", "678tw@s")), row.names = c(NA,
-3L), class = "data.frame")
我们可以在这里使用strsplit
,作为基本的 R 选项:
s_list <- strsplit(df$myindex, "(?<=[0-9])(?=[a-z])", perl=TRUE)
df$mynumber <- lapply(s_list, function(x) x[1])
df$mychart <- lapply(s_list, function(x) x[2])
df
myindex mynumber mychart
1 234yua 234 yua
2 1w 1 w
3 678tw@s 678 tw@s
数据:
df <- data.frame(myindex = c("234yua", "1w", "678tw@s"), stringsAsFactors=FALSE)
这种方法的策略/吸引力是在左侧的数字和右侧的小写字母之间的边界处拆分列值。 这适用于您显示的确切数据,但即使您有其他未显示的边缘情况,也可能可行。
您可以使用单个dplyr::mutate
调用:
dplyr::mutate(df, mynumber = gsub("^(\\d+).*$", "\\1", myindex),
mychart = gsub("^(\\d+)(.*)$", "\\2", myindex))
#> myindex mynumber mychart
#> 1 234yua 234 yua
#> 2 1w 1 w
#> 3 678tw@s 678 tw@s
这个stringr
解决方案也有效(假设数字和非数字部分是连续的):
library(stringr)
df$mynumber <- str_extract(df$myindex, "\\d+")
df$mychart <- str_extract(df$myindex, "[^\\d]+")
结果:
df
myindex mynumber mychart
1 234yua 234 yua
2 1w 1 w
3 678tw@s 678 tw@s
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.