Разделить один неравномерный столбец на 2-4 столбца [duplicate]

Вы можете использовать str.zfill :

print str(1).zfill(2) 
print str(10).zfill(2) 
print str(100).zfill(2) 

печатает:

01
10
100

2
задан R Yoda 9 June 2016 в 17:55
поделиться

4 ответа

Это работает. Он заполняется пробелами, а не NA s, но вы можете изменить этот пост-hoc, если хотите. (fill = 'right' работает только при разбиении на вектор символов, а не на явные позиции.)

maxchar = max(nchar(as.character(df$y)))
tidyr::separate(df, y, into = paste0("y", 1:maxchar), sep = 1:(maxchar - 1))

#    x y1 y2 y3 y4 y5 y6
# 1 X1  0  0  L  0         
# 2 X2  0                  
# 3 X3  0  0  0  1  2  L   
# 4 X4  0  1  2  3  L  0   
# 5 X5  0  D  0      
6
ответ дан Gregor 24 August 2018 в 21:38
поделиться

Вот еще один вариант base R, где мы создаем разделитель , между каждым символом столбца «y», используя gsub, а затем читаем его с помощью read.csv

cbind(df[1],read.csv(text=gsub("(?<=.)(?=.)", ",", df$y, perl=TRUE), 
                header=FALSE,fill=TRUE, na.strings = ""))
#   x V1   V2   V3 V4   V5   V6
#1 X1  0    0    L  0 <NA> <NA>
#2 X2  0 <NA> <NA> NA <NA> <NA>
#3 X3  0    0    0  1    2    L
#4 X4  0    1    2  3    L    0
#5 X5  0    D    0 NA <NA> <NA>

Или используйте tstrsplit из data.table

mxr = max(nchar(as.character(df$y)))
setDT(df)[, paste0("y", seq(mxr)) := tstrsplit(y, "")]
0
ответ дан akrun 24 August 2018 в 21:38
поделиться

Вот базовый метод R.

# split the strings
temp <- strsplit(df$y, split="")
# maximum length of the list items
maxL <- max(sapply(temp, length))
# contstruct data.frame with NAs as fills
temp <- data.frame(do.call(rbind, lapply(temp, function(i) c(i, rep(NA, maxL-length(i))))))

# add to df
df <- cbind(x=df[, -2], temp)

, который приводит к

        x X1   X2   X3   X4   X5   X6
1       X1  0    0    L    0 <NA> <NA>
2       X2  0 <NA> <NA> <NA> <NA> <NA>
3       X3  0    0    0    1    2    L
4       X4  0    1    2    3    L    0
5       X5  0    D    0 <NA> <NA> <NA>

. Я использовал stringsAFactors = FALSE при создании df:

df <- data.frame(x, y, stringsAsFactors = F)

Но, если бы я этого не сделал, этот код привел бы к ошибке, как указывает @ m0h3n. Без этой альтернативной конструкции data.frame необходимо обернуть df $ y в as.character, чтобы принудить переменную от коэффициента к символу:

# split the strings
temp <- strsplit(as.character(df$y), split="")

Спасибо @ m0h3n за это.

4
ответ дан lmo 24 August 2018 в 21:38
поделиться

Вы можете разделить строку в столбце y на отдельные символы с помощью strsplit:

> strsplit("00L0",c()) 
[[1]]
[1] "0" "0" "L" "0"

Начиная с вашего фрейма данных:

> df
   x      y
1 X1   00L0
2 X2      0
3 X3 00012L
4 X4 0123L0
5 X5    0D0

Я решил проблему размещения этих символы в столбцы:

Сначала: используйте ddply, чтобы разбить все строки в столбце y и поместить их в отдельные строки

> ddply(df, .(x), summarise, v = 1:nchar(as.character(y)), 
        y = unlist(strsplit(as.character(y),c())))
    x v y
1  X1 1 0
2  X1 2 0
3  X1 3 L
4  X1 4 0
5  X2 1 0
6  X3 1 0
7  X3 2 0
8  X3 3 0
9  X3 4 1
10 X3 5 2
11 X3 6 L
12 X4 1 0
13 X4 2 1
14 X4 3 2
15 X4 4 3
16 X4 5 L
17 X4 6 0
18 X5 1 0
19 X5 2 D
20 X5 3 0

. Second: Используйте reshape для преобразования строк с одинаковыми x-value в столбцы

> reshape(ans, idvar=c("x"), timevar="v", direction="wide")
    x y.1  y.2  y.3  y.4  y.5  y.6
1  X1   0    0    L    0 <NA> <NA>
5  X2   0 <NA> <NA> <NA> <NA> <NA>
6  X3   0    0    0    1    2    L
12 X4   0    1    2    3    L    0
18 X5   0    D    0 <NA> <NA> <NA>

Это может быть чрезмерно усложняющей проблему, но это единственный способ заставить ее работать!

1
ответ дан zohsvosv 24 August 2018 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: