簡體   English   中英

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

[英]How to create a new column referring to another column?

我花了合理的時間來解決我的問題,但我不能,我決定在這里問。 我有一個來自調查的數據集,其中每個家庭都有不同的身份號碼。 在另一列中給出了該家庭的人數。

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

提前致謝。

如果我們希望輸出末尾帶有字母,請按“HouseholdID”進行分組,然后根據“Individuals”序列將“HouseholdID”與匹配的LETTERS paste在一起

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

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中有很多唯一值,您可以嘗試創建一個新列,其中字母與每個 Individuals 值匹配,然后創建另一列組合Household ID ,最后刪除字母列。

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

希望這有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM