基于另一变量水平的不同重构模式

时间:2018-01-30 19:56:48

标签: r recode

我在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 个答案:

答案 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中没有提到预期输出,但似乎需要recodeA基于列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"