#r
#r
Вопрос:
Я хочу разделить ID
столбец на 3 столбца (называемые «A», «B», «C») на основе строковых индексов. Первый столбец должен сообщать только о элементе 1, вторые элементы 2:3
, последний столбец 4: 7.
ID Data
mw21e10 878
mw61e10 908
mw61e10 1073
Я определил векторы с желаемыми позициями строк, как показано ниже
a <- c(1,2,4)
b <- c(1,3,7)
Я пытаюсь использовать определенные векторы в отдельной функции
df<-mydata %>%
separate(code, c("A", "B", "C"), c(c(1,2,4), c(1,3,7))))
Ответ №1:
Мы можем использовать substring
на основе вектора ‘a’, ‘b’, а затем использовать unnest_wider
для изменения list
столбца на три столбца
library(dplyr)
library(tidyr)
mydata %>%
rowwise %>%
mutate(new = list(substring(ID, a, b))) %>%
ungroup %>%
unnest_wider(c(new), names_repair = ~c(names(mydata), 'A', 'B', 'C'))
-вывод
# A tibble: 3 x 5
# ID Data A B C
# <chr> <int> <chr> <chr> <chr>
#1 mw21e10 878 m w2 1e10
#2 mw61e10 908 m w6 1e10
#3 mw61e10 1073 m w6 1e10
Или, если нам нужно использовать separate
, убедитесь, что указано только положение разделения, а не диапазон из двух векторов. Исходя из выходных substr
данных, он находится в позиции 1, 3
mydata %>%
separate(ID, into = c("A", "B", "C"), c(1, 3 ), remove = FALSE)
-вывод
# ID A B C Data
#1 mw21e10 m w2 1e10 878
#2 mw61e10 m w6 1e10 908
#3 mw61e10 m w6 1e10 1073
Или base R
с помощью Map
mydata[c('A', 'B', 'C')] <- Map(substring, mydata$ID,
MoreArgs = list(first = a, last = b))
данные
mydata <- structure(list(ID = c("mw21e10", "mw61e10", "mw61e10"), Data = c(878L,
908L, 1073L)), class = "data.frame", row.names = c(NA, -3L))
Комментарии:
1. Я установил
Tidyverse
, но все равно функцияunnest_wider
не может быть найдена2. @Al14 это из
tidyr
. Можете ли вы показатьpackageVersion('tidyr')
3.
packageVersion('tidyr')
является0.8.3
4. @Al14 я использовал
1.1.2
Ответ №2:
Один dplyr
и purrr
вариант может быть:
df %>%
bind_cols(map2_dfc(.x = c(1,2,4),
.y = c(1,3,7),
~ df %>%
transmute(col = substr(ID, .x, .y))) %>%
set_names(c("A", "B", "C")))
ID Data A B C
1 mw21e10 878 m w2 1e10
2 mw61e10 908 m w6 1e10
3 mw61e10 1073 m w6 1e10