我有一个data.frame(df
),请参见示例,其中包含有关人的信息。根据关键列(sleutel
),我知道人们是否住在一起(例如,组成家庭)。现在,我需要使用有关家庭“头”的信息来创建新列。
name sex gzverh sleutel gzhfd lft
1 Loekens Man 6 1847LS 9 3 49
2 Kemel Vrouw 5 1847LK 10 2 18
3 Kemel Man 5 1847LK 10 2 22
4 Boersma Vrouw 4 1847LK 10 2 52
5 Kemel Man 2 1847LK 10 1 54
例如,第5行,Kemel,Male和gzhfd 1(=家族Kemel的头)。他与太太结婚。 Boersma(相同的键)。我想更改一个新列(lfthb
),其中包含所有家庭成员的户主年龄。所以应该变成这样:
name sex gzverh sleutel gzhfd lft lfthb
1 Loekens Man 6 1847LS 9 3 49 NA
2 Kemel Vrouw 5 1847LK 10 2 18 54
3 Kemel Man 5 1847LK 10 2 22 54
4 Boersma Vrouw 4 1847LK 10 2 52 54
5 Kemel Man 2 1847LK 10 1 54 54
我使用dplyr
,group_by
和case_when
语句的多个组合对if_else
进行了多种尝试。而且我设法改变了一家之主的专栏。但不适用于其他成员。
例如,显然只更改head本身的值:
df <- df %>% mutate(lfthb = case_when(sleutel == lag(sleutel) & gzhfd == 1 ~ lft))
但是如何在gzhfd == 1
之后包含~
?
示例数据的输入:
structure(list(naam = c("Loekens", "Kemel", "Kemel", "Boersma",
"Kemel"), gesl = c("Man", "Vrouw", "Man", "Vrouw", "Man"), gzverh = c(6L,
5L, 5L, 4L, 2L), sleutel = c("1847LS 9", "1847LK 10", "1847LK 10",
"1847LK 10", "1847LK 10"), gzhfd = c(3, 2, 2, 2, 1), lft = c(49,
18, 22, 52, 54)), row.names = c(NA, 5L), class = "data.frame")
答案 0 :(得分:2)
结合使用replace
和ifelse
,即
library(tidyverse)
df %>%
group_by(sleutel) %>%
mutate(lfthb = ifelse(any(gzhfd == 1), replace(lft, gzhfd != 1, lft[gzhfd == 1]), NA))
给出,
# A tibble: 5 x 7 # Groups: sleutel [2] naam gesl gzverh sleutel gzhfd lft lfthb <chr> <chr> <int> <chr> <dbl> <dbl> <dbl> 1 Loekens Man 6 1847LS 9 3 49 NA 2 Kemel Vrouw 5 1847LK 10 2 18 54 3 Kemel Man 5 1847LK 10 2 22 54 4 Boersma Vrouw 4 1847LK 10 2 52 54 5 Kemel Man 2 1847LK 10 1 54 54
正如@Ronak提到的,我们可以省略replace
部分
df %>%
group_by(sleutel) %>%
mutate(lfthb = if (any(gzhfd == 1)) lft[gzhfd == 1] else NA)
答案 1 :(得分:0)
data.table方法(对于缺少数据的组,返回-INF而不是NA):
dt<-df %>% as.data.table() %>%
.[gzhfd==1, lfthb := lft, by="sleutel"] %>%
.[,lfthb:= max(lfthb,na.rm = T), by="sleutel"]