Как создать новый столбец, ссылаясь на другой столбец? - PullRequest
0 голосов
/ 25 января 2020

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

Household ID  Individuals
173           1 
174           1 
174           2
175           1
175           2
175           3

Я хотел бы создать новый столбец, который будет ссылаться на два других столбца таким образом, чтобы, если в этом домохозяйстве был только один человек, я хотел бы иметь идентификатор домохозяйства (173) ; если число лиц больше одного, то для первого человека я хочу иметь идентификатор домохозяйства (174), для второго - идентификатор домохозяйства + B (например, 174B) и так далее. Я использовал ifelse, но не получил именно то, что хочу. А именно:

Household ID  Individuals  New Column
 173           1            173 
 174           1            174
 174           2            174B  
 175           1            175
 175           2            175B
 175           3            175C

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 25 января 2020

case_when в dplyr пакете - хороший выбор для нескольких ifelse:

library(tidyverse) ; library(stringr)
df %>% mutate(New = case_when(Individuals == 1 ~ str_c(Household_ID, "", sep = ""),
                              Individuals == 2 ~ str_c(Household_ID, "B", sep = ""),
                              Individuals == 3 ~ str_c(Household_ID, "C", sep = "")))

И вот результат, который я получаю:

  Household_ID Individuals  New
1          173           1  173
2          174           1  174
3          174           2 174B
4          175           1  175
5          175           2 175B
6          175           3 175C

PS: Для данных часть, если вам нужно.

library(data.table)
df = fread("Household_ID  Individuals
            173           1 
            174           1 
            174           2
            175           1
            175           2
            175           3")

Но если в Individuals много уникальных значений, вы можете попробовать создать новый столбец с алфавитным соответствием для каждого значения отдельных лиц, а затем создать еще один столбец, чтобы объединить Household ID, наконец, опустите столбец алфавита.

df %>% 
  mutate(Letter = LETTERS[Individuals]) %>%
  mutate(New = ifelse(Individuals != 1, 
                      str_c(Household_ID, Letter, sep = ""), 
                      Household_ID)) %>%
  select(-Letter)

Надеюсь, эта помощь!

0 голосов
/ 25 января 2020

Если нам нужен вывод с буквами в конце, сделайте группу по 'HouseholdID' и затем paste 'HouseholdID' с соответствующим LETTERS на основе последовательности 'Individuals'

library(dplyr)
library(stringr)
df1 %>% 
  group_by(HouseholdID) %>%
  mutate(NewColumn = if(n() > 1) c(HouseholdID[1], 
          str_c(HouseholdID[-1], LETTERS[Individuals[-1]]))
           else as.character(HouseholdID))
# A tibble: 6 x 3
# Groups:   HouseholdID [3]
#  HouseholdID Individuals NewColumn
#        <int>       <int> <chr>    
#1         173           1 173      
#2         174           1 174      
#3         174           2 174B     
#4         175           1 175      
#5         175           2 175B     
#6         175           3 175C     

Или это также можно сделать с make.unique

df1$NewColumn <- make.unique(as.character(HouseholdID))

здесь, вместо БУКВ в конце, уникальный идентификатор - 1, 2, 3

data

df1 <- structure(list(HouseholdID = c(173L, 174L, 174L, 175L, 175L, 
175L), Individuals = c(1L, 1L, 2L, 1L, 2L, 3L)), class = "data.frame", 
row.names = c(NA, 
-6L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...