嗨,我对R编程有疑问,我是R中的新手。 我在excel中有一个数据集,其中的特定列具有这样的值。
123456
123456789
123456789123
现在,我的要求是获取3的倍数的值并分成不同的列。 例如。我的第一行将分为两列,第二行将分为三列
colA colB colC
123 456
123 456 789
所需的输出:
答案 0 :(得分:4)
以下是一些解决方案。前5个不使用任何软件包。其他情况也使用(1)中定义的nc
(列数)和cn
(列名)。
1)read.fwf 使用注释末尾可重复显示的输入DF
计算一行中的最大字符数,然后除以3得到列数nc
。接下来,计算列名cn
。最后使用read.fwf
读取它们。不使用任何软件包。
nc <- max(nchar(DF[[1]]))/3
cn <- paste0("col", head(LETTERS, nc))
read.fwf(textConnection(as.character(DF[[1]])), rep(3, length = nc),
col.names = cn)
给予:
colA colB colC colD
1 123 456 NA NA
2 123 456 789 NA
3 123 456 789 123
2)formatC 上面的一种变化是使用formatC
在每3个字符后插入逗号,并给出字符向量ch
,然后使用{ {1}}。
read.csv
3)strsplit 另一种变化是使用ch <- formatC(DF[[1]], format= "f", digits = 0, big.mark = ",")
read.csv(text = ch, header = FALSE, col.names = cn)
和指定的正则表达式对列进行拆分,然后使用toString将拆分的组件放入逗号分隔的字符串向量中,strsplit
。最后像以前一样使用ch
。
read.csv
4)gsub 另一个变体是使用ch <- sapply(strsplit(as.character(DF[[1]]), "(?<=...)", perl = TRUE), toString)
read.csv(text = ch, header = FALSE, col.names = cn)
每3个字符插入一个逗号,然后像在(2)和(3)中一样使用gsub
。>
read.csv
5)捕获此命令不使用任何read。*例程。它也只使用基数R。
ch <- gsub("(...)(?=.)", "\\1,", DF[[1]], perl = TRUE)
read.csv(text = ch, header = FALSE, col.names = cn)
6)绑带。这是唯一使用包装的版本。 strcapture(strrep("(...)?", nc), DF[[1]], setNames(double(nc), cn))
可用于选取连续的3个字符子集。它使用比我们其他解决方案更简单的正则表达式。 strapplyc
与其他一些解决方案一样使用。
read.csv
可复制形式的输入:
library(gsubfn)
ch <- sapply(strapplyc(DF[[1]], "..."), toString)
read.csv(text = ch, header = FALSE, col.names = cn)
答案 1 :(得分:3)
这是separate
library(tidyverse)
df %>%
separate(a, into = c('b', 'c', 'd'), sep= c(3, 6), remove = FALSE)
# a b c d
#1 123 123
#2 123456 123 456
#3 123456789 123 456 789
使用convert=TRUE
,自动更改列的type
df %>%
separate(a, into = c('b', 'c', 'd'), sep= c(3, 6),
remove = FALSE, convert = TRUE)
df <- data.frame (a = c(123,123456,123456789))
答案 2 :(得分:1)
使用库data.table
onResume()
数据:
library(data.table)
setDT(df1)
df1[, tstrsplit(df1$col1, "(?:.{3}+\\K)", perl = TRUE)] # change {3} to other numbers if you don't want to split after every 3.
# V1 V2 V3 V4
#1: 123 456 <NA> <NA>
#2: 123 456 789 <NA>
#3: 123 456 789 123
答案 3 :(得分:0)
可能有一种方法涉及较少的重复,但是一个选择可能是
library(tidyverse)
df <- data.frame (a = c(123,123456,123456789))
df %>%
mutate(b = substr(a, 0,3),
c = substr(a, 4,6),
d = substr(a, 7,9))
a b c d
1 123 123
2 123456 123 456
3 123456789 123 456 789