【发布时间】:2019-08-02 18:52:22
【问题描述】:
我正在尝试创建一个新变量,该变量涉及数值和逻辑(指标)的乘积之和,但最终结果没有意义。
数据
我已生成以下数据集作为我遇到的问题的最小可重现示例。每行都是一个个体,mJSW_BL、mJSW_12、mJSW_24 和mJSW_36 列是基线的测量值,12、24 和 36。我创建的最后一个变量 JSNCASE_TP 表示第一个个人符合病例定义的时间(12、24 或 36)(从基线减少 0.7)。 JSNCASE_TP 的计算应该忽略 NA 值,可以取值 0、12、24 或 36。
require(dplyr)
set.seed(1)
N = 10
mJSW_BL <- runif(N,0.1,2)
mJSW_12 <- runif(N,0.1,2)
mJSW_24 <- runif(N,0.1,2)
mJSW_36 <- runif(N,0.1,2)
#Randomly set some values to NA
mJSW_12[sample(N,2)] <- NA
mJSW_36[sample(N,1)] <- NA
#Create dataframe
df <- data.frame(mJSW_BL,mJSW_12,mJSW_24,mJSW_36)
df2 <- df %>%
#Create variables indicating decrease from BL
mutate(mJSW_BLto12 = mJSW_BL - mJSW_12,
mJSW_BLto24 = mJSW_BL - mJSW_24,
mJSW_BLto36 = mJSW_BL - mJSW_36) %>%
#JSN case - decrease by 0.7 from BL
mutate(JSNCASE_12 = (mJSW_BLto12>=0.7),
JSNCASE_24 = (mJSW_BLto24>=0.7),
JSNCASE_36 = (mJSW_BLto36>=0.7)) %>%
#Which timepoint did JSN first occur?
mutate(JSNCASE_TP = sum(12*JSNCASE_12,
24*(JSNCASE_24 & !JSNCASE_12),
36*(JSNCASE_36 & !(JSNCASE_12 | JSNCASE_24)),
na.rm=TRUE))
问题
在数据df2中,以第4行为例,其中JSNCASE_12、JSNCASE_24和JSNCASE_36都是TRUE,但JSNCASE_TP=36。应该是JSNCASE_TP=12。此外,取第 6 行,其中JSNCASE_12=NA、JSNCASE_24=TRUE 和JSNCASE_36=FALSE。我应该得到JSNCASE_TP=24。也许我错过了一些基本的东西,但我尝试了几种方法并没有产生预期的结果。 10 行的JSNCASE_TP 的值应为0,0,0,12,0,24,24,0,0,0。
编辑 感谢@Dave2e 的 cmets,下面的代码可以正常工作:
df2 <- df %>%
#Create variables indicating decrease from BL
mutate(mJSW_BLto12 = mJSW_BL - mJSW_12,
mJSW_BLto24 = mJSW_BL - mJSW_24,
mJSW_BLto36 = mJSW_BL - mJSW_36) %>%
#JSN case - decrease by 0.7 from BL
mutate(JSNCASE_12 = (mJSW_BLto12>=0.7),
JSNCASE_24 = (mJSW_BLto24>=0.7),
JSNCASE_36 = (mJSW_BLto36>=0.7)) %>%
rowwise() %>%
#Which timepoint did JSN first occur?
mutate(JSNCASE_TP = sum(12*JSNCASE_12,
24*(JSNCASE_24 & (!JSNCASE_12| is.na(JSNCASE_12))),
36*(JSNCASE_36 & ((!JSNCASE_12 | is.na(JSNCASE_12)) &
(!JSNCASE_24 | is.na(JSNCASE_24)))),
na.rm=TRUE))
【问题讨论】:
-
您对
sum的使用不正确。该函数将所有三个向量组合并返回一个总计。您需要明智地执行求和行。 -
谢谢。一旦我在最后一个
mutate之前添加“rowwise() %>%”,这就会关闭。但是,我仍然无法获得JSNCASE_TP的第一个“24”(第 6 行),因为总和计算结果为(FALSE & !(NA | TRUE)),输出 0。 -
这可能适用于其他情况:
24*(df2$JSNCASE_24 & (!JSNCASE_12| is.na(JSNCASE_12))) -
知道了!谢谢!