基于另一个变量水平的不同模式的重新编码
Different Patterns of Recodes Based on Level of Another Variable
我在 R 中工作,我正在尝试折叠变量 A 的代码(将 6 级变成 4 级)。我还需要 A 的重新编码在变量 B 的不同级别(2 个级别)不同。所以我需要类似的东西:
df$A[df$B=='1']=重新编码(df$A, "'1'='4'; '2'='2'; '3'='4'; '4'='3'; '5'='4'; '6'='4'")
df$A[df$B=='2']=重新编码(df$A, "'1'='1'; '2'='1'; '3'='1'; '4'='1'; '5'='1'; '6'='1'")
我希望这两个都在一个新变量 C 中(将 6 X 2 矩阵折叠成一个 4 级因子)。我想我可以用循环或函数之类的东西来做,但我是新手,不知道该怎么做。
只有 2 个组,您应该可以使用 ifelse()
:
set.seed(42)
dfr <- data.frame(A=sample(as.character(1:6), 100, replace=TRUE),
B=sample(as.character(1:2), 100, replace=TRUE))
xtabs(~A+B, dfr)
# B
# A 1 2
# 1 5 11
# 2 12 2
# 3 6 9
# 4 5 11
# 5 9 11
# 6 7 12
v1 <- c('4', '2', '4', '3', '4', '4')
v2 <- c('1', '1', '1', '1', '1', '1')
idx <- as.numeric(dfr$A)
dfr$C <- ifelse(dfr$B == "1", v1[idx], v2[idx])
xtabs(~C+A+B, dfr)
# , , B = 1
# A
# C 1 2 3 4 5 6
# 1 0 0 0 0 0 0
# 2 0 12 0 0 0 0
# 3 0 0 0 5 0 0
# 4 5 0 6 0 9 7
# , , B = 2
# A
# C 1 2 3 4 5 6
# 1 11 2 9 11 11 12
# 2 0 0 0 0 0 0
# 3 0 0 0 0 0 0
# 4 0 0 0 0 0 0
虽然 OP 中没有提到预期输出,但似乎需要根据列 B
的值 recode
列 A
来准备一个精细的 4 级因子。
# Data
df <- data.frame(A = 1:6, B = rep(2:1,3))
df
# A B
#1 1 2
#2 2 1
#3 3 2
#4 4 1
#5 5 2
#6 6 1
#Use of which to find matching rows
index1 <- which(df$B == 1)
index2 <- which(df$B == 2)
df$C[index1] <- recode(df$A[index1], '1'='4', '2'='2', '3'='4', '4'='3', '5'='4', '6'='4')
df$C[index2] = recode(df$A[index2], '1'='1', '2'='1', '3'='1', '4'='1', '5'='1', '6'='1')
df
# A B C
#1 1 1 4
#2 2 2 1
#3 3 1 4
#4 4 2 1
#5 5 1 4
#6 6 2 1
> unique(df$C)
[1] "1" "2" "3" "4"
我在 R 中工作,我正在尝试折叠变量 A 的代码(将 6 级变成 4 级)。我还需要 A 的重新编码在变量 B 的不同级别(2 个级别)不同。所以我需要类似的东西:
df$A[df$B=='1']=重新编码(df$A, "'1'='4'; '2'='2'; '3'='4'; '4'='3'; '5'='4'; '6'='4'")
df$A[df$B=='2']=重新编码(df$A, "'1'='1'; '2'='1'; '3'='1'; '4'='1'; '5'='1'; '6'='1'")
我希望这两个都在一个新变量 C 中(将 6 X 2 矩阵折叠成一个 4 级因子)。我想我可以用循环或函数之类的东西来做,但我是新手,不知道该怎么做。
只有 2 个组,您应该可以使用 ifelse()
:
set.seed(42)
dfr <- data.frame(A=sample(as.character(1:6), 100, replace=TRUE),
B=sample(as.character(1:2), 100, replace=TRUE))
xtabs(~A+B, dfr)
# B
# A 1 2
# 1 5 11
# 2 12 2
# 3 6 9
# 4 5 11
# 5 9 11
# 6 7 12
v1 <- c('4', '2', '4', '3', '4', '4')
v2 <- c('1', '1', '1', '1', '1', '1')
idx <- as.numeric(dfr$A)
dfr$C <- ifelse(dfr$B == "1", v1[idx], v2[idx])
xtabs(~C+A+B, dfr)
# , , B = 1
# A
# C 1 2 3 4 5 6
# 1 0 0 0 0 0 0
# 2 0 12 0 0 0 0
# 3 0 0 0 5 0 0
# 4 5 0 6 0 9 7
# , , B = 2
# A
# C 1 2 3 4 5 6
# 1 11 2 9 11 11 12
# 2 0 0 0 0 0 0
# 3 0 0 0 0 0 0
# 4 0 0 0 0 0 0
虽然 OP 中没有提到预期输出,但似乎需要根据列 B
的值 recode
列 A
来准备一个精细的 4 级因子。
# Data
df <- data.frame(A = 1:6, B = rep(2:1,3))
df
# A B
#1 1 2
#2 2 1
#3 3 2
#4 4 1
#5 5 2
#6 6 1
#Use of which to find matching rows
index1 <- which(df$B == 1)
index2 <- which(df$B == 2)
df$C[index1] <- recode(df$A[index1], '1'='4', '2'='2', '3'='4', '4'='3', '5'='4', '6'='4')
df$C[index2] = recode(df$A[index2], '1'='1', '2'='1', '3'='1', '4'='1', '5'='1', '6'='1')
df
# A B C
#1 1 1 4
#2 2 2 1
#3 3 1 4
#4 4 2 1
#5 5 1 4
#6 6 2 1
> unique(df$C)
[1] "1" "2" "3" "4"