Преобразование строки во фрейме данных в вектор и удаление фрейма данных

Дан кадр данных, в котором каждое наблюдение в столбце представляет собой строку вида «x ~ y», где x и y — целые числа.

Цель состоит в том, чтобы преобразовать строку «x~y» в вектор c(x..y), представляющий собой последовательность чисел, начинающуюся с целого числа x и заканчивающуюся целым числом y.

Наконец, фрейм данных должен быть невложенным, чтобы каждый элемент вектора получил свою собственную строку, а другие столбцы правильно повторялись.

Например, вот фрейм данных:

A     B
A1  -1~1
A2   1~3
A3   2~4

Приведенный выше фрейм данных следует изменить на следующее:

  A     B
    A1   -1
    A1    0
    A1    1
    A2    1
    A2    2
    A2    3
    A3    2
    A3    3
    A3    4

Невозможно установить примеры str_replace, так как случаев много.. Как мне сделать этот код??


person JUHYEONN    schedule 21.12.2017    source источник
comment
dff <- separate_rows(df, B, sep="~"); do.call(bind_rows, lapply(split(dff, dff$A), function(x) { data.frame(A=head(x$A,1), B=seq(min(x$B), max(x$B))) })) должен сделать с этим.   -  person Abdou    schedule 22.12.2017


Ответы (1)


Поскольку ваш столбец B можно легко преобразовать в выражение, которое дает вам то, что вы хотите, я бы использовал следующий подход.

# Using tidyverse for stringr (str_replace), tidyr (unnest), and purrr (map)
library(tidyverse)

# recreating your dataframe
df <- data.frame(A=c("A1","A2","A3"),B=c("-1~1","1~3","2~4"), stringsAsFactors = FALSE)

Это решение состоит из трех частей. Сначала преобразуйте строки в столбце B в выражения seq. Так что "x~y" становится "seq(x,y,by=1)".

df$B <- str_replace(df$B,"\\~",",")
df$B <- paste("seq(",df$B,",by=1)")

Одна из приятных особенностей R заключается в том, что если вы можете генерировать строки, содержащие выражения R, вы можете затем оценить их с помощью "eval(parse())", как это...

df$B <- map(df$B, ~ eval(parse(text=.)))

В качестве альтернативы вы могли бы дать вызову map() функцию, которая будет принимать ваши исходные строки символов «x ~ y» и возвращать вектор целых чисел, который вы хотите, но я думаю, что это решение имеет наименьшую типизацию (я думаю?).

Как бы вы это ни делали, теперь у вас есть столбец B, в котором каждое наблюдение представляет собой целочисленный вектор.

> df
   A        B
1 A1 -1, 0, 1
2 A2  1, 2, 3
3 A3  2, 3, 4

На последнем шаге отмените вложенность векторов в B, используя функцию tidyr, unnest. Это будет автоматически повторять значения столбца A в строках по мере необходимости.

> df <- unnest(df)
> df
   A  B
1 A1 -1
2 A1  0
3 A1  1
4 A2  1
5 A2  2
6 A2  3
7 A3  2
8 A3  3
9 A3  4
person Angelo    schedule 21.12.2017