【问题标题】:How to create a new column referring to another column?如何创建引用另一列的新列?
【发布时间】:2020-01-25 17:34:22
【问题描述】:

我已经花费了合理的时间来解决我的问题,但我无法解决,我决定在这里提问。 我有一个调查数据集,其中每个家庭都有不同的身份号码。在另一列中,给出了该家庭的个人人数。

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

我想做的是创建一个新列,该列引用另外两个列,如果该家庭只有一个人,我想拥有家庭 ID (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

提前致谢。

【问题讨论】:

  • 试试make.unique df1 %>% mutate(Newcolumn = make.unique(as.character(HouseholdID)))

标签: r


【解决方案1】:

dplyr包中的case_when是多个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中有很多唯一值,你可以尝试创建一个新列与每个Individuals值的字母匹配,然后创建另一个列来组合Household ID,删除字母列最后。

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

希望对您有所帮助!

【讨论】:

  • 顺便说一句,您可以先使用as.characterHoushold IDcolumn 类更改为字符。
  • @BaranAksoy 如果可行,您可以接受我的回答并给这个回答一个绿色的点击!谢谢!
【解决方案2】:

如果我们想要以 LETTERS 结尾的输出,请按 'HouseholdID' 然后 paste 'HouseholdID' 与基于 'Individuals' 序列的匹配 LETTERS 进行分组

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,而不是末尾的 LETTERS

数据

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

【讨论】:

  • 感谢您的回答@akrun。我已经解决了这个问题。
猜你喜欢
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
  • 2021-03-30
  • 1970-01-01
  • 2018-11-27
  • 2021-12-02
  • 2021-01-16
相关资源
最近更新 更多