根据我的数据集,我试图根据排名来做对。我的数据看起来
ID grp rank
1 grp1 1
1 grp2 1
1 grp3 2
2 grp1 1
2 grp2 2
2 grp2 2
2 grp2 2
2 grp3 2
2 grp1 3 我的目标输出如下:对于每个ID
这看起来如下所示
ID rank source destination
1 1 grp1 grp1
1 1 grp2 grp2
1 2 grp1 grp3
1 2 grp2 grp3
2 1 grp1 grp1
2 2 grp1 grp2
2 2 grp1 grp2
2 2 grp1 grp2
2 2 grp1 grp3
2 3 grp2 grp1
2 3 grp3 grp1我从for循环和if_else语句开始,但是我被卡住了。任何帮助都是非常感谢的!提前结束。
发布于 2018-12-18 10:20:54
我们可以采取以下措施:
df %>% group_by(ID) %>%
do(map_dfr(1:nrow(.), function(i)
data.frame(.[i, -2], source = if(.$rank[i] == 1) .$grp[i] else unique(.$grp[.$rank == .$rank[i] - 1]),
destination = .$grp[i])))
# A tibble: 11 x 4
# Groups: ID [2]
# ID rank source destination
# <int> <int> <fct> <fct>
# 1 1 1 grp1 grp1
# 2 1 1 grp2 grp2
# 3 1 2 grp1 grp3
# 4 1 2 grp2 grp3
# 5 2 1 grp1 grp1
# 6 2 2 grp1 grp2
# 7 2 2 grp1 grp2
# 8 2 2 grp1 grp2
# 9 2 2 grp1 grp3
# 10 2 3 grp2 grp1
# 11 2 3 grp3 grp1 我们按ID分组,然后遍历给定组的每一行。然后,对于每一行,我们根据您的规则构造一个新的数据框架。
https://stackoverflow.com/questions/53829063
复制相似问题