![](/img/trans.png)
[英]Efficient way to create a dataframe with multiple summary columns based on a grouped dataframe using dplyr in R
[英]efficient way to create a new variable from multiple columns in R dataframe
我正在尝试根据某些条件从一组 480 个变量中创建一个名为 DRG 的新变量,如果条件为真,则新变量是一个二进制变量。 如果数据框中的任何列的值为 060 或 191,则 DRG =1 否则 DRG =0;
for (i in 1:nrow(DATA_opioid)){
for (j in 42:480)
{ if (!is.na(DATA_opioid[i,j]) {
if ( (DATA_opioid[i,j]) == '060' | (DATA_opioid[i,j]) == '191'| (DATA_opioid[i,j+1]))==
'060' |(!is.na(DATA_opioid[i,j+1]))=='191')
{
DATA_opioid$DRG =1
}
else DATA_opioid$DRG =0
}
}
我一直无法得到一个工作代码,尽管当我为其中一列尝试它时我确实成功了。 但是有 480 个变量都以前缀“RX”开头。 任何解决此问题的有用建议都非常受欢迎。
for (i in 1:nrow(DATA_opioid)){
if (DATA_opioid$RX1CAT1[i] == "060" | DATA_opioid$RX1CAT1[i] == "191"){
DATA_opioid$DRG[i] =1
}
else DATA_opioid$DRG[i] =0
}
您不需要为此类操作使用循环。 有很多方法可以做到这一点。 这里有几个。
使用rowSums
df$DRG <- +(rowSums(df == '191' | df == '060') > 0)
# a b DRG
#1 1 2 0
#2 2 3 0
#3 3 4 0
#4 4 060 1
#5 5 3 0
#6 191 4 1
使用apply
df$DRG <- +(apply(df == '191' | df == '060', 1, any))
我们也可以在dplyr
链中使用rowSums
library(dplyr)
df %>% mutate(DRG = +(rowSums(. == '191' | . == '060') > 0))
如果您只想在某些列上进行测试,则对上述解决方案中的这些列的数据框进行子集化。 例如要测试第 3 到 5 列,您可以执行
df$DRG <- +(apply(df[3:5] == '191' | df == '060', 1, any))
数据
对此数据进行了测试:
df <- data.frame(a = c(1:5, 191), b = c(2:4, '060', 3:4))
假设您的数据框称为 df:
DRG<-apply(df,1,function(x){
max(x == "060" | x == 191)
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.