R:生成组内值不同的指标

R:生成组内值不同的指标,r,R,我有一个数据框,其中每一行是一个观察值,我有两列: 观察的组成员 观察的结果 我正在尝试创建一个新变量outcome\u change,如果给定组中的所有观察值outcome不相同,则该变量的值为1,否则为0 下面的代码(dat)是我所拥有的数据的一个示例。同时,dat_out1显示了在没有NA值的情况下,我希望代码产生什么。dat_out2是相同的,只是它表明当组值中缺少值时,会产生相同的结果 当然,dplyr::group_by()在某种程度上可以做到这一点?我不知道如何在小组内进行这些

我有一个数据框,其中每一行是一个观察值,我有两列:

  • 观察的
    组成员
  • 观察的
    结果
我正在尝试创建一个新变量
outcome\u change
,如果给定
组中的所有观察值
outcome
不相同,则该变量的值为1,否则为0

下面的代码(
dat
)是我所拥有的数据的一个示例。同时,
dat_out1
显示了在没有
NA
值的情况下,我希望代码产生什么。
dat_out2
是相同的,只是它表明当组值中缺少值时,会产生相同的结果

当然,dplyr::group_by()在某种程度上可以做到这一点?我不知道如何在小组内进行这些比较

  # Input (2 groups: 1 with identical values of outcome
  # in the group (group a) and 1 with differing values of
  # outcome in the group (group b) 
  dat <- data.frame(group = c("a","a","a","b","b","b"), 
                    outcome = c(1,1,1,3,2,2))

  # Output 1: add a variable for all observations belonging to
  # a group where the outcome changed within each group
  dat_out1 <-   data.frame(group = c("a","a","a","b","b","b"), 
                                  outcome = c(1,1,1,3,2,2),
                                  outcome_change = c(0,0,0,1,1,1))

  # Output 2: same as Output 1, but able to ignore NA values
  dat_out2 <-     data.frame(group = c("a","a","a","b","b","b"), 
                              outcome = c(1,1,NA,3,2,NA),
                              outcome_change = c(0,0,0,1,1,1))
#输入(2组:1组具有相同的结果值
#在组(a组)和1中,具有不同的
#组内结果(b组)
dat下面是一个例子:

library(tidyverse)
dat %>%
  group_by(group) %>%
  mutate(outcome_change = ifelse(length(unique(outcome[!is.na(outcome)])) > 1, 1, 0))
#output
# A tibble: 6 x 3
# Groups:   group [2]
   group outcome outcome_change
  <fctr>   <dbl>          <dbl>
1      a       1              0
2      a       1              0
3      a       1              0
4      b       3              1
5      b       2              1
6      b       2              1
下面是一个例子:

library(tidyverse)
dat %>%
  group_by(group) %>%
  mutate(outcome_change = ifelse(length(unique(outcome[!is.na(outcome)])) > 1, 1, 0))
#output
# A tibble: 6 x 3
# Groups:   group [2]
   group outcome outcome_change
  <fctr>   <dbl>          <dbl>
1      a       1              0
2      a       1              0
3      a       1              0
4      b       3              1
5      b       2              1
6      b       2              1
库(dplyr)
dat%
变异(结果变化=ifelse(最小值(结果,na.rm=TRUE)=最大值(结果,na.rm=TRUE),0,1))
库(dplyr)
dat%
变异(结果变化=ifelse(最小值(结果,na.rm=TRUE)=最大值(结果,na.rm=TRUE),0,1))

这里有一个使用
数据的选项。表

library(data.table)
setDT(dat1)[, outcome_change := as.integer(uniqueN(outcome[!is.na(outcome)])>1), group]
dat1
#   group outcome outcome_change
#1:     a       1              0  
#2:     a       1              0
#3:     a       1              0
#4:     b       3              1
#5:     b       2              1
#6:     b       2              1
如果我们将其应用于“dat2”

dat2
#    group outcome outcome_change2
#1:     a       1               0
#2:     a       1               0
#3:     a      NA               0
#4:     b       3               1
#5:     b       2               1
#6:     b      NA               1

这里有一个使用
数据的选项。表

library(data.table)
setDT(dat1)[, outcome_change := as.integer(uniqueN(outcome[!is.na(outcome)])>1), group]
dat1
#   group outcome outcome_change
#1:     a       1              0  
#2:     a       1              0
#3:     a       1              0
#4:     b       3              1
#5:     b       2              1
#6:     b       2              1
如果我们将其应用于“dat2”

dat2
#    group outcome outcome_change2
#1:     a       1               0
#2:     a       1               0
#3:     a      NA               0
#4:     b       3               1
#5:     b       2               1
#6:     b      NA               1

严格地说,当值缺失时,你无法知道结果是否相同。是的,我应该说“观察值”或非缺失值是相同的。严格地说,当值缺失时,你无法知道结果是否相同。是的,我应该说“观察值”或者,非缺失值是相同的。或者更短一些:
output\u change=1*(min(output)==max(output))
。更好的是,将其作为逻辑值保留,这在上下文中是很自然的。很好的解决方案。不如上述方法透明。或者更短一些:
output\u change=1*(min(output)==max(output))
。最好还是将其保留为逻辑值,这是上下文中的自然值。好的解决方案。比上面的值更不透明。这得到答案,因为它在所做的工作中最透明。如果DPRIR更多,我们可以将
长度(唯一(结果[!is.na(结果)])>1
表达式简化为
n\u distinct(outcome,na.rm=TRUE)>1
。这得到了答案,因为它所做的事情是最透明的。使用更多dplyr,我们可以将
长度(唯一(outcome[!is.na(outcome)])>1
表达式简化为
n_distinct(outcome,na.rm=TRUE)>1