问题描述
早上好,我想通过数据框实现某些目标,我认为这是可变偏移量和匹配的结合,但是我不太确定如何在R中做到这一点。
采样数据以复制原始和所需的输出:
original = data.frame(
ID = c(1,2,3,2),Type = c("Live","Live","Dead"),Number = c(100,20,30,40,50,NA))
desired = data.frame(
ID = c(1,NA),Number2 = c(NA,NA,50))
基本上,我想要实现的是当Type =“ Dead”时,当该ID为“ Live”时,我想获得系列中的最后一个Number。相同的ID可能可以存在于多行中(例如ID = 2),但是当ID的Type =“ Dead”时,我想提取该ID所在的最后一个数字。面临的挑战是,并非并非前一行始终具有相同的ID,因此我需要针对所有ID进行某种形式的归纳。
谢谢!
解决方法
这是一种方式
packets = socket.socket(socket.AF_PACKET,socket.SOCK_RAW,socket.ntohs(3))
host_s = socket.socket( socket.AF_PACKET,socket.ntohs(ETH_P_ALL))
host_s.bind((HOST,0))
host_s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,0)
us = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
us.bind((HOST,1900))
在这里,我们按ID对ID进行分组,然后为每个“ Dead”值找到Number所在的“ Number”的最后一个值,如果不是“ Dead”,则返回NA
,这是基本的R选项
(u <- Reduce(
rbind,lapply(
split(original,original$ID),function(v) {
within(v,Number2 <- ifelse(Type == "Dead",tail(Number[Type == "Live"],1),NA
))
}
)
))[order(as.numeric(row.names(u))),]
给出
ID Type Number Number2
1 1 Live 100 NA
2 2 Live 20 NA
3 3 Live 30 NA
4 2 Live 40 NA
5 2 Live 50 NA
6 2 Dead NA 50