我在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级因子)。我假设我可以用循环或函数或其他东西来做,但我是新手,并且不知道该怎么做。
答案 0 :(得分:0)
只有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
答案 1 :(得分:0)
虽然OP中没有提到预期输出,但似乎需要recode
列A
基于列B
的值来准备精细的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"