在摘要(dplyr)中使用特定值,而不将其过滤掉

在摘要(dplyr)中使用特定值,而不将其过滤掉,r,dplyr,R,Dplyr,我试图比较一个新算法和一个旧算法的结果。我需要知道新算法与旧算法在预测“D”方面的差异大约有多少天 我似乎不知道如何在没有过滤的情况下指向包含“D”(min(day)和new=='D')的第一行(day)(由于分组原因,我能够使用双过滤器抓取该行,但没有使用它)。我想使用dplyr在summary中使用它,这就是为什么我在自己的数据集中包含了与我当前所在位置类似的伪代码。 在我的数据中,每个ID都有不同长度(天数)的组,这就是我在示例中创建不同长度组的原因 库(dplyr) id=c(12345

我试图比较一个新算法和一个旧算法的结果。我需要知道新算法与旧算法在预测“D”方面的差异大约有多少天

我似乎不知道如何在没有过滤的情况下指向包含“D”(min(day)和new=='D')的第一行(day)(由于分组原因,我能够使用双过滤器抓取该行,但没有使用它)。我想使用
dplyr
summary
中使用它,这就是为什么我在自己的数据集中包含了与我当前所在位置类似的伪代码。 在我的数据中,每个ID都有不同长度(天数)的组,这就是我在示例中创建不同长度组的原因

库(dplyr)
id=c(123456456456456456)
old=c('S','S','S','S','D','S','S','D','D')
new=c('S','S','D','D','D','S','D','D','D','D')
天=c(1,2,3,4,5,1,2,3,4)
data=data.frame(id、旧、新、日)
数据
#>我喜欢旧的新的一天
#>1123s1
#>2 123 S 2
#>3123SD3
#>4123SD4
#>5123D5
#>6456 S 1
#>7456 S D 2
#>8456 D 3
#>9456 D 4
d=数据%>%
分组依据(id)%>%
安排(天,.按组=T)%>%
添加计数(新=='S',名称='S')%>%
添加计数(新=='D',名称='D')%>%
分组人(id、S、D)
#总结(差异=(第一个旧D日)-(第一个新D日))
#预期结果
ido=c(123456)
S=c(2,1)
D=c(3,3)
差=c(2,1)
结果=数据帧(ido、S、D、diff)
结果
#>ido S D diff
#> 1 123 2 3    2
#> 2 456 1 3    1

由(v0.3.0)创建于2019-12-26我们可以使用
pivot\u wide
after
summary
ing在创建列后获得频率计数,以根据“旧”和“新”列中第一次出现的“D”计算“天”之间的差值

library(dplyr)
library(tidyr)
data %>% 
  group_by(id) %>% 
  group_by(diff = day[match("D", old)] - day[match("D", new)],
       new, add = TRUE) %>%
  summarise(n = n()) %>%
  ungroup %>% 
  pivot_wider(names_from = new, values_from = n)
# A tibble: 2 x 4
#     id  diff     D     S
#  <dbl> <dbl> <int> <int>
#1   123     2     3     2
#2   456     1     3     1
库(dplyr)
图书馆(tidyr)
数据%>%
分组依据(id)%>%
分组依据(差异=日期[匹配(“D”,旧)]-日期[匹配(“D”,新)],
新建,添加=真)%>%
总结(n=n())%>%
解组%>%
透视图(名称从=新,值从=n)
#一个tibble:2x4
#id差异
#     
#1   123     2     3     2
#2   456     1     3     1

我们可以
根据
id
对u进行分组,并计算
'S'
'D'
的出现次数,以及
旧的
新的
'D'
首次出现次数之间的差异

library(dplyr)

data %>%
  group_by(id) %>%
  summarise(S = sum(new == 'S'), 
            D = sum(new == 'D'), 
            diff = which.max(old == 'D') - which.max(new == 'D'))
            #OR if there could be id without D use
            #diff = which(old == 'D')[1] - which(new == 'D')[1])

# A tibble: 2 x 4
#     id     S     D  diff
#  <dbl> <int> <int> <int>
#1   123     2     3     2
#2   456     1     3     1
库(dplyr)
数据%>%
分组依据(id)%>%
总结(S=总和(新=‘S’),
D=总和(新的=='D'),
diff=which.max(旧=='D')-which.max(新=='D'))
#或者如果不使用D就可以有id
#差异=哪个(旧=='D')[1]-哪个(新=='D')[1])
#一个tibble:2x4
#id S D diff
#     
#1   123     2     3     2
#2   456     1     3     1

谢谢!!如此优雅的解决方案。你能解释一下为什么逻辑上它是which.max()而不是which.min()?
old='D'
给出了一个带有真/假值的逻辑向量。通过使用
which.max
我们得到向量中第一个真值的位置。尝试以下示例
which.max(FALSE,TRUE,TRUE)
which.max(FALSE,FALSE,TRUE,FALSE,TRUE)
。若您注意到它返回第一个真值的位置。我们在这里使用相同的逻辑。