如何使用 while 循环基于现有变量创建虚拟变量?
How to use while loop to creat a dummy variable based on an existing variable?
我有一个名为“X1”的分类变量和一个名为“X2”的虚拟变量。现在我想按照以下逻辑创建一个虚拟变量 X3:
如果在 X1 的任何类别的任何行中,至少有一行获得 X2=1,则为该类别的所有行设置 X3=1,否则为 0。
X1<-c(1,1,2,2,,3,3)
X2<-c(0,1,0,0,1,1)
我正在寻找的所需输出是这样的:
X1 X2 X3
1 0 1
1 1 1
2 0 0
2 0 0
3 1 1
3 1 1
感谢任何帮助。
你可以得到每组X2
的max
值(X1
)。
library(dplyr)
df %>% group_by(X1) %>% mutate(X3 = max(X2)) %>% ungroup
# X1 X2 X3
# <dbl> <dbl> <dbl>
#1 1 0 1
#2 1 1 1
#3 2 0 0
#4 2 0 0
#5 3 1 1
#6 3 1 1
在基数 R 和 data.table
中:
#Base R
transform(df, X3 = ave(X2, X1, FUN = max))
#data.table
library(data.table)
setDT(df)[, X3 := max(X2), X1]
数据
X1<-c(1,1,2,2,3,3)
X2<-c(0,1,0,0,1,1)
df <- data.frame(X1, X2)
这是一个 dplyr
解决方案:
df = data.frame(
X1 = c(1,1,2,2,3,3),
X2 = c(0,1,0,0,1,1)
)
library(dplyr)
df %>%
group_by(X1) %>%
mutate(X3 = ifelse(1 %in% X2, 1, 0))
# # A tibble: 6 x 3
# # Groups: X1 [3]
# X1 X2 X3
# <dbl> <dbl> <dbl>
# 1 1 0 1
# 2 1 1 1
# 3 2 0 0
# 4 2 0 0
# 5 3 1 1
# 6 3 1 1
在 base R 中有同样的想法:
df$X3 = with(df, ave(X2, X1, FUN = function(x) ifelse(1 %in% x, 1, 0)))
df
# X1 X2 X3
# 1 1 0 1
# 2 1 1 1
# 3 2 0 0
# 4 2 0 0
# 5 3 1 1
# 6 3 1 1
使用collapse
library(collapse)
ftransform(df, X3 = fmax(X2, X1, TRA = 'replace_fill'))
数据
df <- structure(list(X1 = c(1, 1, 2, 2, 3, 3), X2 = c(0, 1, 0, 0, 1,
1)), class = "data.frame", row.names = c(NA, -6L))
我有一个名为“X1”的分类变量和一个名为“X2”的虚拟变量。现在我想按照以下逻辑创建一个虚拟变量 X3:
如果在 X1 的任何类别的任何行中,至少有一行获得 X2=1,则为该类别的所有行设置 X3=1,否则为 0。
X1<-c(1,1,2,2,,3,3)
X2<-c(0,1,0,0,1,1)
我正在寻找的所需输出是这样的:
X1 X2 X3
1 0 1
1 1 1
2 0 0
2 0 0
3 1 1
3 1 1
感谢任何帮助。
你可以得到每组X2
的max
值(X1
)。
library(dplyr)
df %>% group_by(X1) %>% mutate(X3 = max(X2)) %>% ungroup
# X1 X2 X3
# <dbl> <dbl> <dbl>
#1 1 0 1
#2 1 1 1
#3 2 0 0
#4 2 0 0
#5 3 1 1
#6 3 1 1
在基数 R 和 data.table
中:
#Base R
transform(df, X3 = ave(X2, X1, FUN = max))
#data.table
library(data.table)
setDT(df)[, X3 := max(X2), X1]
数据
X1<-c(1,1,2,2,3,3)
X2<-c(0,1,0,0,1,1)
df <- data.frame(X1, X2)
这是一个 dplyr
解决方案:
df = data.frame(
X1 = c(1,1,2,2,3,3),
X2 = c(0,1,0,0,1,1)
)
library(dplyr)
df %>%
group_by(X1) %>%
mutate(X3 = ifelse(1 %in% X2, 1, 0))
# # A tibble: 6 x 3
# # Groups: X1 [3]
# X1 X2 X3
# <dbl> <dbl> <dbl>
# 1 1 0 1
# 2 1 1 1
# 3 2 0 0
# 4 2 0 0
# 5 3 1 1
# 6 3 1 1
在 base R 中有同样的想法:
df$X3 = with(df, ave(X2, X1, FUN = function(x) ifelse(1 %in% x, 1, 0)))
df
# X1 X2 X3
# 1 1 0 1
# 2 1 1 1
# 3 2 0 0
# 4 2 0 0
# 5 3 1 1
# 6 3 1 1
使用collapse
library(collapse)
ftransform(df, X3 = fmax(X2, X1, TRA = 'replace_fill'))
数据
df <- structure(list(X1 = c(1, 1, 2, 2, 3, 3), X2 = c(0, 1, 0, 0, 1,
1)), class = "data.frame", row.names = c(NA, -6L))