gpt4 book ai didi

基于多种条件 reshape 数据框

转载 作者:行者123 更新时间:2023-12-03 19:15:13 25 4
gpt4 key购买 nike

我想确定在时间 t 期间在同一地点和同一个人进行的事件。变量 wher表示事件在时间 t 发生的时间步长和记录。 with 参数记录了在时间 t 与谁进行了事件。我想知道在时间 t 基于性别在同一地点和同一个人进行的常见事件。不寻常的事件和在不同地方与不同人进行的事件我用0代替。

输入

id     DMSex       t1  t2  t3  t4  wher1 wher2 wher3 wher4 wit1 wit2 wit3 wit4  
12 M 12 12 12 12 1 1 1 4 8 9 4 0
12 F 10 13 12 12 3 1 1 5 6 5 4 1

输出:
id  t1  t2  t3  t4  
12 0 0 12 0
18 time steps 的样本数据:
structure(list(serial = c(11011202, 11011202), DMSex = c(1, 2
), act1_1 = c(110, 110), act1_2 = c(110, 110), act1_3 = c(110,
110), act1_4 = c(110, 110), act1_5 = c(110, 110), act1_6 = c(110,
110), act1_7 = c(110, 110), act1_8 = c(110, 110), act1_9 = c(110,
110), act1_10 = c(110, 110), act1_11 = c(110, 110), act1_12 = c(8219,
110), act1_13 = c(310, 110), act1_14 = c(3210, 110), act1_15 = c(3110,
110), act1_16 = c(7241, 110), act1_17 = c(210, 110), act1_18 = c(3819,
110), wher_1 = c(11, 11), wher_2 = c(11, 11), wher_3 = c(11,
11), wher_4 = c(11, 11), wher_5 = c(11, 11), wher_6 = c(11, 11
), wher_7 = c(11, 11), wher_8 = c(11, 11), wher_9 = c(11, 11),
wher_10 = c(11, 11), wher_11 = c(11, 11), wher_12 = c(11,
11), wher_13 = c(11, 11), wher_14 = c(11, 11), wher_15 = c(11,
11), wher_16 = c(11, 11), wher_17 = c(11, 11), wher_18 = c(11,
11), wit4_1 = c(0, 0), wit4_2 = c(0, 0), wit4_3 = c(0, 0),
wit4_4 = c(0, 0), wit4_5 = c(0, 0), wit4_6 = c(0, 0), wit4_7 = c(0,
0), wit4_8 = c(0, 0), wit4_9 = c(0, 0), wit4_10 = c(0, 0),
wit4_11 = c(0, 0), wit4_12 = c(0, 0), wit4_13 = c(0, 0),
wit4_14 = c(0, 0), wit4_15 = c(0, 0), wit4_16 = c(0, 0),
wit4_17 = c(0, 0), wit4_18 = c(0, 0)), row.names = 1:2, class = "data.frame")

哪里 act1_t ; wit4witwher_wher

最佳答案

结合dplyr的一种解决方案和 purrr可能:

map(.x = as.character(1:4),
~ df %>%
select(id, ends_with(.x)) %>%
group_by(id) %>%
mutate_at(vars(matches("^wher|^wit")), ~ all(. == first(.))) %>%
ungroup() %>%
mutate(cond = rowSums(select(., matches("^wher|^wit"))) == 2) %>%
group_by(id) %>%
mutate_at(vars(starts_with("t")), ~ all(. == first(.)) * cond * .) %>%
ungroup() %>%
select(starts_with("t"))) %>%
bind_cols(df %>%
select(id)) %>%
group_by(id) %>%
summarise_all(first)

id t1 t2 t3 t4
<int> <int> <int> <int> <int>
1 12 0 0 12 0

首先,它创建一个从 1 到 4 的字符向量,因为有四对变量(从 t1、wher1、wit1 到 t4、wher4、wit4)。映射函数应用于这些元素。其次,从 df 中,它单独选择变量对,并检查每个 ID 的所有行中的 wher 和 wit 是否相同,从而创建逻辑条件。第三,它检查每个 ID 的所有行的 t 变量是否相同,并将其与步骤 2 中的逻辑条件进行比较。如果为 TRUE,则返回原始值,如果不是,则返回 0。最后,它合并数据并保持每个 ID 一行。

更新问题的解决方案,添加了 stringr :
map(.x = str_extract(names(df)[grepl("^act", names(df))], "_.*+$"),
~ df %>%
select(serial, ends_with(.x)) %>%
group_by(serial) %>%
mutate_at(vars(matches("^wher|^wit")), ~ all(. == first(.))) %>%
ungroup() %>%
mutate(cond = rowSums(select(., matches("^wher|^wit"))) == 2) %>%
group_by(serial) %>%
mutate_at(vars(starts_with("act")), ~ all(. == first(.)) * cond * .) %>%
ungroup() %>%
select(starts_with("act"))) %>%
bind_cols(df %>%
select(serial)) %>%
group_by(serial) %>%
summarise_all(first)

serial act1_1 act1_2 act1_3 act1_4 act1_5 act1_6 act1_7 act1_8 act1_9 act1_10 act1_11 act1_12
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1.10e7 110 110 110 110 110 110 110 110 110 110 110 0
# … with 6 more variables: act1_13 <dbl>, act1_14 <dbl>, act1_15 <dbl>, act1_16 <dbl>,
# act1_17 <dbl>, act1_18 <dbl>

关于基于多种条件 reshape 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60985031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com