r - 将一个字符列一分为二并重复
问题描述
这是我掌握的数据
v11 <- c("00240031", "00310028")
v12 <- c("00000000", "00000000")
v13 <- c("00310064", "00180058")
data <- data.frame(v11, v12, v13)
data <- lapply(data, as.character)
testdata <- as.data.frame(data, stringsAsFactors = F)
testdata[testdata == '0'] <- '000000000'
testdata
我想将每一列(从 v11 到 v99)分成两列。我用substr
这样的方式拆分第一列,
transform(v11, v11_a = substr(v11, 1, 4), v11_b = substr(v11, 5, 8))
X_data v11_a v11_b
1 00240031 0024 0031
2 00310028 0031 0028
看起来不错,除了X_data
柱子。我不想在输出中有它。有更好的方法吗?
tidyr::separate
不适用,因为我的数据是字符类型?
v11 %>% separate(v11, into = c('v11_a', 'v11_b'), sep = 4)
Error in UseMethod("separate_") :
no applicable method for 'separate_' applied to an object of class "character"
其次,如何为后续列(例如 v11 到 v99)重复该过程?
理想情况下,在拆分然后转换为数字类型后,我的最终数据应该如下所示,
> dataf
v11_a v11_b v12_a v12_b v13_a v13_b
1 24 31 0 0 31 64
2 31 28 0 0 18 58
评论:
您想出惊人的解决方案的速度之快令人惊讶。谢谢你们。
解决方案
在base R
中,这可以通过遍历列、用分隔符替换非零之间的 0 、读入,
data.frame ( read.table
) 和数据集来完成cbind
list
lst1 <- lapply(testdata, function(x) {
x1 <- read.table(text = sub("(?<=[1-9])0+", ",", x, perl = TRUE),
header = FALSE, sep=",", col.names = c('a', 'b'), fill = TRUE)
replace(x1, is.na(x1), 0)})
do.call(cbind, lst1)
# v11.a v11.b v12.a v12.b v13.a v13.b
#1 24 31 0 0 31 64
#2 31 28 0 0 18 58
也可以tidyverse
通过首先gather
进入“长”格式,然后执行separate
离子,最后spread
返回“宽”格式来完成
library(tidyverse)
gather(testdata) %>%
separate(value, into = c('a', 'b'), sep=4, convert = TRUE) %>%
gather(key1, val, a:b) %>%
unite(key, key, key1, sep="_") %>%
group_by(key) %>%
mutate(ind = row_number()) %>%
spread(key, val) %>%
select(-ind)
# A tibble: 2 x 6
# v11_a v11_b v12_a v12_b v13_a v13_b
# <int> <int> <int> <int> <int> <int>
#1 24 31 0 0 31 64
#2 31 28 0 0 18 58
或者另一种选择是使用summarise_all
withread.table
testdata %>%
summarise_all(funs(list(read.table(text =sub("^(....)", "\\1 ", .),
header = FALSE)))) %>%
unnest
推荐阅读
- javascript - 为什么这个事件总是触发?
- android - 使用任何一个
与 Firestore - amazon-s3 - 使用带有签名 Cookie 的 AWS Cloudfront 的 CORS 问题。AllowedOrigin 未设置为标头中传递的内容
- azure-devops - Azure DevOps REST 代理请求缺少最后一个已完成的属性
- java - 骆驼onException后的多个处理程序
- apache-kafka - 当并发级别小于分区号时,Spring Kafka SeekToCurrentErrorHandler maxFailures 不起作用
- php - 类定义被调用两次?无法为 symfony3.4 声明类错误
- ios - 径向 CAGradientLayer 在运行时无法正确渲染
- python - 无法为 git-bash 配置 python 和 anaconda:
- stream - flink如何处理两个流通过键连接,但没有匹配的键