考虑到我们有以下数据
df <- data.frame(jan=c(10,7,1),
feb=c(20,9,2),
mar=c(30,6,3),
apr=c(5,5,4),
may=c(0,9,5),
jun=c(10,8,6)
)
jan feb mar apr may jun
1 10 20 30 5 0 10
2 7 9 6 5 9 8
3 1 2 3 4 5 6
我期望得到一个新的标志变量,它是通过比较1列集(jan feb mar)与(apr may jun)而得到的,如果1集的值与另一集的值匹配,则flag ='Y',否则'N'。
这里,jan值匹配第一行的jun,因此标志为Y。
jan feb mar apr may jun flag
1 10 20 30 5 0 10 Y
2 7 9 6 5 9 8 Y
3 1 2 3 4 5 6 N
5条答案
按热度按时间jm2pwxwz1#
如果性能是一个问题,则采用矢量化方法:
在一个更大的数据集上与其他几个解决方案进行基准测试。首先将解决方案作为函数实现。
基准
vof42yt12#
首先,我们在每次迭代中遍历dataframe的行和
unlist
dataframe到每个“集合”的向量。然后使用%in%
运算符查看第一个集合中的any
元素是否出现在第二个集合中。最后将结果分配给df
的flag
列。ifelse
部分仅用于将逻辑输出转换为“Y”和“N”。如果您对逻辑输出没有问题,则可以忽略它。vatpfxk53#
你可以尝试
这应该给予
axr492tv4#
1)dplyr在每一行上,如果前3列中的任一列在接下来3列中的任一列中,则将flag设置为Y,否则设置为N。
2)碱R
3)崩溃
4)Base R - 2这使用了(3)中的
yn
函数。注意事项
问题中的输入
df
:gmxoilav5#
看起来像是您试图标记{jan,feb,mar}中的任何一个与{apr,may,jun}中的任何一个值匹配的行。使用data.table包,可以选择与搜索模式匹配的行,然后用“Y”分配一个新的标志列
这种方法允许您通过名称指定列,因此,如果列的顺序发生变化,则不太可能中断。