Предположим, у меня есть этот набор данных:
age height weight
"1/2/3" "12/15/18" "30/40/37"
Как я могу получить набор данных, подобный набору данных ниже?
age height weight
1 12 30
2 15 40
3 18 37
А что, если бы мой набор данных был таким:
name age height weight
"Jack" "1/2/3" "12/15/18" "30/40/37"
Я хочу иметь набор данных, как показано ниже:
name age height weight
"Jack" 1 12 30
"Jack" 2 15 40
"Jack" 3 18 37
Как я могу это сделать?
Если ваши данные в формате фрейма данных, как это:
df <- data.frame(age = '1/2/3', height = '12/15/18', weight = '30/40/37')
df
#> age height weight
#> 1 1/2/3 12/15/18 30/40/37
Вы могли бы сделать
as.data.frame(lapply(df, function(x) as.numeric(unlist(strsplit(x, '/')))))
#> age height weight
#> 1 1 12 30
#> 2 2 15 40
#> 3 3 18 37
Тот же код будет работать, если ваши данные являются именованным вектором (из вопроса неясно, в каком формате находятся ваши данные, но приведенный выше код должен работать в любом случае, если ваши данные называются df
)
Created on 2022-04-10 by the reprex package (v2.0.1)
Если вы не возражаете против использования внешнего пакета, вы можете использовать separate_rows()
из пакета tidyr
.
library(tidyverse)
df %>% separate_rows(-name, sep = "/")
# A tibble: 3 × 4
name age height weight
<chr> <chr> <chr> <chr>
1 Jack 1 12 30
2 Jack 2 15 40
3 Jack 3 18 37
Я всегда использую tidyverse. Большое спасибо.
@AllanCameron Ты прав. Мне так жаль. Я снова внес некоторые изменения, так что ваш ответ тоже правильный.
Большое спасибо. Я внес изменение в свой вопрос. Я очень ценю, если вы ответите и на этот вопрос.