![](/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.