繁体   English   中英

在 R 中,如何将一列拆分为两列? 谢谢

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM