我有50列名称,但为了方便起见,这里只列出4列。
Name1 Name2 Name3 Name4
Rose,Ali Van,Hall Ghol,Dam Murr,kate
Camp,Laura Ka,Klo Dan,Dan Ali,Hoss
Rose,Ali Van,Hall Ghol,Dam Kol,Kan
Murr,Kate Ismal, Ismal Sian,Rozi Nas,Ami
Ghol,Dam Ka,Klo Rose,Ali Nor,Ko
Murr,Kate Ismal, Ismal Dan,Dan Nas,Ami
我想根据列给每个人分配数字,一个数字序列。
例如,在名称1中,我们得到1-4的数字。重复的名称将得到相同的数字。
在名称2中,应该从5开始,以此类推。这将给予下表:
Assign1 Assian2 Assian3 Assian4
1 5 8 12
2 6 9 13
1 5 8 14
3 7 10 15
4 6 11 17
3 7 9 15
我希望它没有循环,即sapply
,即sapply(dat, function(x) match(x, unique(x)))
。
使用dplyr或tidyverse将是伟大的。
4条答案
按热度按时间pu82cl6c1#
tidyverse
解决方案与purrr::accumulate()
:vdgimpew2#
因为每列的值都依赖于前一列的值,所以计算必须按顺序进行。这可能是通过循环实现的最简洁的方法。请记住,
lapply
和sapply
只是伪装的循环,不会比显式循环更快。请注意,您的预期输出中有一个错误(有一个数字17,应该是16)
如果你真的不想使用显式循环,你可以这样做:
创建于2023年1月13日,使用reprex v2.0.2
mrwjdhj33#
下面是一个
tidyverse
方法:首先
paste
所有列中每个字符串后面的列名,以便以后排序;然后pivot
它到一个两列df中,以便我们可以通过match
给它们分配ID;最后pivot
它回到一个宽格式,并取消嵌套列表列。数据
摘自@艾伦·卡梅隆。
ukqbszuj4#
将查找表与
tidyverse
一起使用:输出:
数据来自@艾伦·卡梅隆,谢谢。