我已经花费了合理的时间来解决我的问题,但是我不能,所以我决定在这里提问。 我从一项调查中获得了一个数据集,其中每个家庭都有不同的身份证号码。在另一栏中,给出了该家庭的个人数量。
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
先谢谢了。
答案 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)
希望有帮助!