簡體   English   中英

如何為數據幀的子集重新編碼多個變量?

[英]How to recode multiple variables for a subset of a dataframe?

我迷路了,所以任何指示都會有所幫助。 假設我有一個數據框:

df <- data.frame(
  id = 1:12,
  v1 = rep(c(1:4), 3),
  v2 = rep(c(1:3), 4),
  v3 = rep(c(1:6), 2),
  v4 = rep(c(1:2), 6))

我的目標是為變量 v3 和 v4 重新編碼 2=4 和 4=2,但僅適用於前 4 種情況(id < 5)。 我正在尋找一種適用於多達 20 個變量的解決方案。 我知道如何進行基本的重新編碼,但我沒有看到在操作多個變量時實現子集條件的簡單方法。

您可以嘗試mutate_atcase_whendplyr

library(dplyr)

df %>%
  mutate_at(vars(v3:v4), ~case_when(id < 5 & . == 4 ~ 2L, 
                                    id < 5 & . == 2 ~ 4L, 
                                    TRUE ~.))
#   id v1 v2 v3 v4
#1   1  1  1  1  1
#2   2  2  2  4  4
#3   3  3  3  3  1
#4   4  4  1  2  4
#5   5  1  2  5  1
#6   6  2  3  6  2
#7   7  3  1  1  1
#8   8  4  2  2  2
#9   9  1  3  3  1
#10 10  2  1  4  2
#11 11  3  2  5  1
#12 12  4  3  6  2

使用mutate_at您可以指定要應用該函數的列范圍。

這是一個基本的R解決方案,

df[1:5, c('v3', 'v4')] <- lapply(df[1:5, c('v3', 'v4')], function(i) 
                                       ifelse(i == 2, 4, ifelse(i == 4, 2, i)))

這使,

 id v1 v2 v3 v4 1 1 1 1 1 1 2 2 2 2 4 4 3 3 3 3 3 1 4 4 4 1 2 4 5 5 1 2 5 1 6 6 2 3 6 2 7 7 3 1 1 1 8 8 4 2 2 2 9 9 1 3 3 1 10 10 2 1 4 2 11 11 3 2 5 1 12 12 4 3 6 2

另一個更直接的選擇是獲取要替換的數字的索引,並將它們替換為 6 減去數字 (6-4=2, 6-2=4):

whToChange <- which(df[1:5, c("v3", "v4")] ==2 | df[1:5, c("v3", "v4")]==4, arr.ind=TRUE)

df[, c("v3", "v4")][whToChange] <- 6-df[, c("v3", "v4")][whToChange]

head(df, 5)
#  id v1 v2 v3 v4
#1  1  1  1  1  1
#2  2  2  2  4  4
#3  3  3  3  3  1
#4  4  4  1  2  4
#5  5  1  2  5  1

您可以使用match和查找表 - 只是在追逐中,您必須退回兩個以上的值。

rosetta <- matrix(c(2,4,4,2), 2)
df[1:4, c("v3", "v4")] <- lapply(df[1:4, c("v3", "v4")], function(x) {
  i <- match(x, rosetta[1,]); j <- !is.na(i); "[<-"(x, j, rosetta[2, i[j]])})
df
#   id v1 v2 v3 v4
#1   1  1  1  1  1
#2   2  2  2  4  4
#3   3  3  3  3  1
#4   4  4  1  2  4
#5   5  1  2  5  1
#6   6  2  3  6  2
#7   7  3  1  1  1
#8   8  4  2  2  2
#9   9  1  3  3  1
#10 10  2  1  4  2
#11 11  3  2  5  1
#12 12  4  3  6  2

也看看R: How to recode multiple variables at onceRecoding multiple variables in R

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM