Если у меня есть набор данных, подобный следующему:
# State Ben.Carson.Number.of.Votes Ben.Carson.Party Ben.Carson.Percent Bernie.Sanders.Votes Bernie Sanders.Percent Bernie.Sanders.Party
# OH 305. Republican 8.3 500 12.30 Democrat
# FL 20 Republican 3.0 700 11.00. Democrat
# TX 400. Republican 5.0 50 1.00 Democrat
Как создать четыре унифицированных столбца: «Имя кандидата», «Голоса», «Процент» и «Партия» из всех отдельных столбцов, находящихся в текущем наборе данных? То есть соберите вместе все три типа столбцов на основе имени кандидата, расположенного в имени столбца.
Я пробовал следующее, но безуспешно:
tidyElectionData %>%
gather(key, value, -c(County, Location.State, State)) %>%
separate(key, into = c("Candidate", "Party"), sep = "(^[^.]+[.][^.]+)(.+$)") %>%
spread(Party, value)
2 ответа
Решение, основанное на тидиверсе, может выглядеть следующим образом.
library(dplyr)
library(tidyr)
library(stringr)
df %>%
mutate(across(everything(), as.character)) %>%
pivot_longer(-State) %>%
mutate(names = str_extract(name, 'Votes|Party|Percent'),
name = str_extract(name, 'Ben.Carson|Bernie.Sanders')) %>%
pivot_wider(names_from = names, values_from = value)
# State name Votes Party Percent
# <chr> <chr> <chr> <chr> <chr>
# 1 OH Ben.Carson 305 Republican 8.3
# 2 OH Bernie.Sanders 500 Democrat 12.3
# 3 FL Ben.Carson 20 Republican 3
# 4 FL Bernie.Sanders 700 Democrat 11
# 5 TX Ben.Carson 400 Republican 5
# 6 TX Bernie.Sanders 50 Democrat 1
Данные
df <- structure(list(State = c("OH", "FL", "TX"), Ben.Carson.Number.of.Votes = c(305,
20, 400), Ben.Carson.Party = c("Republican", "Republican", "Republican"
), Ben.Carson.Percent = c(8.3, 3, 5), Bernie.Sanders.Votes = c(500,
700, 50), Bernie.Sanders.Percent = c(12.3, 11, 1), Bernie.Sanders.Party = c("Democrat",
"Democrat", "Democrat")), row.names = c(NA, -3L), class = c("tbl_df",
"tbl", "data.frame"))
В базе R вы могли:
candidates <- unique(sub("(\\w+[.]\\w+).*","\\1",names(df)[-1]))
columns <- split(names(df[-1]),sub(".*[.]","",names(df)[-1]))
df1<-reshape(df, columns, dir = "long", times = candidates, idvar = "State")
names(df1)[-1]<-c("candidate", names(columns))
rownames(df1) <- NULL
df1
State candidate Party Percent Votes
1 OH Ben.Carson Republican 8.3 305
2 FL Ben.Carson Republican 3 20
3 TX Ben.Carson Republican 5 400
4 OH Bernie.Sanders Democrat 12.30 500
5 FL Bernie.Sanders Democrat 11.00. 700
6 TX Bernie.Sanders Democrat 1.00 50
Похожие вопросы
Новые вопросы
r
R — это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, используйте минимально воспроизводимые примеры, которые другие могут запустить с помощью копирования и вставки. Показать желаемый результат полностью. Используйте dput() для данных и укажите все небазовые пакеты с помощью library(). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов по статистике используйте https://stats.stackexchange.com.