Используя R, как я могу разбить данные, разделенные запятыми, на отдельные строки? - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть фрейм данных, в котором некоторые наблюдения разделены запятыми, и я хотел бы разделить их на разные строки. Я знаю, что есть способ сделать это с помощью функции Отдельные_строки из tidyr, но у меня есть дополнительное ограничение.

Вот код для получения моего фрейма данных:

dat <- structure(list(cit.num = c("29496, 37063", "29496, 37063", "36706, 36707", 
"36706, 36707"), civ.race = c("Black", "White", "Hispanic", "Hispanic"
), civ.sex = c("Male", "Female", "Female", "Male"), count = c(2L, 
2L, 2L, 2L)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-4L))

Вот что данные выглядят так:

  cit.num      civ.race civ.sex count
1 29496, 37063 Black    Male        2
2 29496, 37063 White    Female      2
3 36706, 36707 Hispanic Female      2
4 36706, 36707 Hispanic Male        2

cit.num идентифицирует отдельного гражданина. Я знаю, что 29496 относится к черному мужчине, а 37063 относится к белой женщине. Есть ли способ разделить строки так, чтобы первое значение совпадало с правильными civ.race и civ.sex? Вот мой желаемый вывод:

  cit.num civ.race civ.sex count
1 29496   Black    Male        2
2 37063   White    Female      2
3 36706   Hispanic Female      2
4 36707   Hispanic Male        2

Ответы [ 4 ]

1 голос
/ 05 апреля 2020

Вы можете использовать for l oop:

Ключом к этому является то, что вы определяете последовательность неравных чисел:

seq(1, nrow(dat), by = 2)

Эта последовательность вы указали for до l oop свыше:

for(i in seq(1, nrow(dat), by = 2)){
  dat$cit.num[i] <- gsub(", \\d+", "", dat$cit.num[i])
  dat$cit.num[i+1] <- gsub("\\d+, ", "", dat$cit.num[i+1])
}

Выход:

dat
  cit.num civ.race civ.sex count
1   29496    Black    Male     2
2   37063    White  Female     2
3   36706 Hispanic  Female     2
4   36707 Hispanic    Male     2
1 голос
/ 05 апреля 2020

Если вы уже знаете cit.num, который должен соответствовать каждой комбинации civ.race и civ.sex, я думаю, было бы проще сделать соединение с соответствующими ключами. Вот код, чтобы сделать это, используя left_join.

library(tidyverse)

keys <- data.frame(civ.race = c("Black","Black","White","White","Hispanic","Hispanic"),
                   civ.sex = c("Male","Female","Male","Female","Male","Female"),
                   cit.num = c(29496,29495,37064,37063,36707,36706),
                   stringsAsFactors = F)

dat %>%
  #Drop you original cit.num column
  select(-cit.num) %>%
  #Do the join using civ.race and civ sex to match the entries in dat and keys
  left_join(keys, 
            by = c("civ.race","civ.sex"))

# A tibble: 4 x 4
# civ.race civ.sex count cit.num
# <chr>    <chr>   <int>   <dbl>
# 1 Black    Male        2   29496
# 2 White    Female      2   37063
# 3 Hispanic Female      2   36706
# 4 Hispanic Male        2   36707
0 голосов
/ 05 апреля 2020

Если у нас есть только два числа в cit.num, мы могли бы использовать separate_rows для получения данных в разных строках и выбирать 1-ю и 4-ю строки в каждой cit.num.

library(dplyr)

dat %>%
  mutate(temp = cit.num) %>%
  tidyr::separate_rows(cit.num) %>%
  group_by(temp) %>%
  slice(c(1, 4)) %>%
  ungroup() %>%
  select(-temp)


# cit.num civ.race civ.sex count
#  <chr>   <chr>    <chr>   <int>
#1 29496   Black    Male        2
#2 37063   White    Female      2
#3 36706   Hispanic Female      2
#4 36707   Hispanic Male        2
0 голосов
/ 05 апреля 2020

Вот альтернатива tidyverse. Вы можете разделить ваш столбец cit.num на 2 столбца, first и second.

Затем, группируя по этой комбинации, вы устанавливаете cit.num как число first или second (first, если первая из двух строк, и second в противном случае).

library(tidyverse)

dat %>%
  separate(cit.num, into = c("first", "second")) %>%
  group_by(first, second) %>%
  mutate(cit.num = ifelse(row_number() == 1, first, second)) %>%
  ungroup() %>%
  select(c(-first, -second))

Выход

# A tibble: 4 x 4
  civ.race civ.sex count cit.num
  <chr>    <chr>   <int> <chr>  
1 Black    Male        2 29496  
2 White    Female      2 37063  
3 Hispanic Female      2 36706  
4 Hispanic Male        2 36707
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...