如何创建引用另一列的新列?

时间:2020-01-25 00:51:51

标签: r

我已经花费了合理的时间来解决我的问题,但是我不能,所以我决定在这里提问。 我从一项调查中获得了一个数据集,其中每个家庭都有不同的身份证号码。在另一栏中,给出了该家庭的个人数量。

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

我想做的是创建一个新列,该列引用另外两个列,这样的话,如果该家庭只有一个人,我想拥有住户编号(173);如果个人人数多于一个,对于第一个个人,我要拥有住户ID(174),对于第二个个人,我要拥有住户ID + 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 :(得分:0)

如果我们想在输出的末尾加上LETTERS,请按“ HouseholdID”进行分组,然后根据“个人”序列用匹配的paste LETTERS“ HouseholdID”

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,而不是最后的字母

数据

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))

答案 1 :(得分:0)

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

P.S:如果需要,用于数据部分。

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)

希望有帮助!

相关问题