假设我有
SAMPN PERNO loop car bus walk mode
1 1 1 3.4 2.5 1.5 1
1 1 1 3 2 1 2
1 1 1 4 2 5 3
1 1 2 14 1 3 1
1 1 2 5 8 2 1
2 1 1 1 5 5 3
2 1 1 9 4 3 3
模式列与汽车和步行交叉。
mode==1 walk
mode==2 car
mode==3 bus
SAMPN是家庭,PERNO成员的家庭索引,每个人的环游。我想在每个循环中添加每个家庭中每个人的模式价值。
例如在第一家庭SAMPN==1
第一人称PERNO==1
中,我们有3行用于第一次旅行loop==1
。在此行中,第一行的模式是步行(mode==1
),第二行的模式是汽车(mode==2
),第三行的模式是公共汽车(mode==3
)
所以我将第二排的汽车和第三排的巴士3.4 + 2 + 5 = 10.4添加第一行的步行路程。对其他人一样
输出:
SAMPN PERNO loop car bus walk mode utility
1 1 1 3.4 2.5 1.5 1 10.4
1 1 1 3 2 1 2 10.4
1 1 1 4 2 5 3 10.4
1 1 2 14 1 3 1 19
1 1 2 5 8 2 1 19
2 1 1 1 5 5 3 8
2 1 1 9 4 3 3 8
答案 0 :(得分:1)
df %>%
mutate(utility = case_when(mode == 1 ~ car, # using the order in the example,
mode == 2 ~ bus, # not the order in the table
mode == 3 ~ walk,
TRUE ~ 0)) %>%
count(SAMPN, PERNO, loop, wt = utility, name = "utility")
## A tibble: 3 x 4
# SAMPN PERNO loop utility
# <int> <int> <int> <dbl>
#1 1 1 1 10.4
#2 1 1 2 19
#3 2 1 1 8
或者,要获得确切的输出:
df %>%
mutate(utility= case_when(mode == 1 ~ car,
mode == 2 ~ bus,
mode == 3 ~ walk,
TRUE ~ 0)) %>%
group_by(SAMPN, PERNO, loop) %>%
mutate(utility = sum(utility))
## A tibble: 7 x 8
## Groups: SAMPN, PERNO, loop [3]
# SAMPN PERNO loop car bus walk mode utility
# <int> <int> <int> <dbl> <dbl> <dbl> <int> <dbl>
#1 1 1 1 3.4 2.5 1.5 1 10.4
#2 1 1 1 3 2 1 2 10.4
#3 1 1 1 4 2 5 3 10.4
#4 1 1 2 14 1 3 1 19
#5 1 1 2 5 8 2 1 19
#6 2 1 1 1 5 5 3 8
#7 2 1 1 9 4 3 3 8
答案 1 :(得分:1)
这里是使用base R
的选项。创建一个与名为“ mode”的命名列名称(“ nm1” 0,然后cbind
与行索引)匹配的列索引,从数据集中提取相应的元素,使用ave
来获得{ 1}}按“ SAMPN”分组,并在“循环”列中将其分配给“实用程序”
sum
nm1 <- setNames(names(df1)[4:6], 1:3)[as.character(df1$mode)]
i1 <- cbind(seq_len(nrow(df1)), match(nm1, names(df1)))
df1$utility <- ave(df1[i1], df1$SAMPN, df1$PERNO, df1$loop, FUN = sum)
df1$utility
#[1] 10.4 10.4 10.4 19.0 19.0 8.0 8.0