R:什么是重新编码变量的有效方法?我如何按比例分配意味着什么?
我想知道是否有人能告诉我如何用相同的规则重新编码多个变量。我有以下dfR:什么是重新编码变量的有效方法?我如何按比例分配意味着什么?,r,statistics,recode,R,Statistics,Recode,我想知道是否有人能告诉我如何用相同的规则重新编码多个变量。我有以下dfbhs1: structure(list(bhs1_1 = c(NA, 1, NA, 2, 1, 2), bhs1_2 = c(NA, 2, NA, 2, 1, 1), bhs1_3 = c(NA, 1, NA, 2, 2, 2), bhs1_4 = c(NA, 2, NA, 1, 1, 1), bhs1_5 = c(NA, 1, NA, 1, 2, 2), bhs1_6 = c(NA, 1, NA, 2, 1, 2),
bhs1
:
structure(list(bhs1_1 = c(NA, 1, NA, 2, 1, 2), bhs1_2 = c(NA,
2, NA, 2, 1, 1), bhs1_3 = c(NA, 1, NA, 2, 2, 2), bhs1_4 = c(NA,
2, NA, 1, 1, 1), bhs1_5 = c(NA, 1, NA, 1, 2, 2), bhs1_6 = c(NA,
1, NA, 2, 1, 2), bhs1_7 = c(NA, 1, NA, 1, 2, 1), bhs1_8 = c(NA,
2, NA, 2, 2, 2), bhs1_9 = c(NA, 1, NA, 2, 1, 1), bhs1_10 = c(NA,
2, NA, 1, 2, 2), bhs1_11 = c(NA, 2, NA, 2, 2, 1), bhs1_12 = c(NA,
2, NA, 2, 1, 1), bhs1_13 = c(NA, 1, NA, 1, 2, 2), bhs1_14 = c(NA,
2, NA, 2, 1, 1), bhs1_15 = c(NA, 1, NA, 2, 2, 2), bhs1_16 = c(NA,
2, NA, 2, 2, 2), bhs1_17 = c(NA, 2, NA, 2, 2, 1), bhs1_18 = c(NA,
1, NA, 1, 2, 1), bhs1_19 = c(NA, 1, NA, 2, 1, 2), bhs1_20 = c(NA,
2, NA, 2, 1, 1)), row.names = c(NA, -6L), class = c("tbl_df",
"tbl", "data.frame"))
对于一半的数据集,有两种转换规则,例如:
(bhs1_2, bhs1_4, bhs1_7, bhs1_9, bhs1_11, bhs1_12, bhs1_14, bhs1_16, bhs1_17,
bhs1_18, bhs1_20)
(if_else(1, 1, 0))
and
(bhs1_1, bhs1_3, bhs1_5, bhs1_6, bhs1_8, bhs1_10, bhs1_13,
bhs1_15, bhs1_19)
(if_else(2, 1, 0))
有没有一种优雅的方式来编写代码来满足这个用例?如果是这样的话,有人能给我指出正确的方向和/或提供一个样本吗?这里有一个使用
dplyr
library(dplyr)
case1 <- vars(bhs1_2, bhs1_4, bhs1_7, bhs1_9, bhs1_11, bhs1_12, bhs1_14, bhs1_16, bhs1_17,
bhs1_18, bhs1_20)
case2 <- vars(bhs1_1, bhs1_3, bhs1_5, bhs1_6, bhs1_8, bhs1_10, bhs1_13,
bhs1_15, bhs1_19)
result <- df %>%
mutate_at(case1, ~ (. == 1) * 1L) %>%
mutate_at(case2, ~ (. == 2) * 1L)
库(dplyr)
案例1这里有一个使用dplyr的解决方案
library(dplyr)
case1 <- vars(bhs1_2, bhs1_4, bhs1_7, bhs1_9, bhs1_11, bhs1_12, bhs1_14, bhs1_16, bhs1_17,
bhs1_18, bhs1_20)
case2 <- vars(bhs1_1, bhs1_3, bhs1_5, bhs1_6, bhs1_8, bhs1_10, bhs1_13,
bhs1_15, bhs1_19)
result <- df %>%
mutate_at(case1, ~ (. == 1) * 1L) %>%
mutate_at(case2, ~ (. == 2) * 1L)
库(dplyr)
案例1我们可以创建感兴趣的列名,然后从逻辑表达式转换为二进制(as.integer
)
case1 <- c("bhs1_2", "bhs1_4", "bhs1_7", "bhs1_9", "bhs1_11", "bhs1_12",
"bhs1_14", "bhs1_16", "bhs1_17", "bhs1_18", "bhs1_20")
case2 <- c("bhs1_1", "bhs1_3", "bhs1_5", "bhs1_6", "bhs1_8",
"bhs1_10", "bhs1_13", "bhs1_15", "bhs1_19")
library(magrittr)
df1 %<>%
mutate_at(vars(case1), funs(as.integer(.==1 ))) %<>%
mutate_at(vars(case2), funs(as.integer(.==2)))
df1
# A tibble: 6 x 20
# bhs1_1 bhs1_2 bhs1_3 bhs1_4 bhs1_5 bhs1_6 bhs1_7 bhs1_8 bhs1_9 bhs1_10
# <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#1 NA NA NA NA NA NA NA NA NA NA
#2 0 0 0 0 0 0 1 1 1 1
#3 NA NA NA NA NA NA NA NA NA NA
#4 1 0 1 1 0 1 1 1 0 0
#5 0 1 1 1 1 0 0 1 1 1
#6 1 1 1 1 1 1 1 1 1 1
# ... with 10 more variables: bhs1_11 <int>, bhs1_12 <int>, bhs1_13 <int>,
# bhs1_14 <int>, bhs1_15 <int>, bhs1_16 <int>, bhs1_17 <int>, bhs1_18 <int>,
# bhs1_19 <int>, bhs1_20 <int>
注意,这并不是假设所有的值都相同,我们可以创建感兴趣的列名,然后从逻辑表达式转换为二进制(as.integer
)
case1 <- c("bhs1_2", "bhs1_4", "bhs1_7", "bhs1_9", "bhs1_11", "bhs1_12",
"bhs1_14", "bhs1_16", "bhs1_17", "bhs1_18", "bhs1_20")
case2 <- c("bhs1_1", "bhs1_3", "bhs1_5", "bhs1_6", "bhs1_8",
"bhs1_10", "bhs1_13", "bhs1_15", "bhs1_19")
library(magrittr)
df1 %<>%
mutate_at(vars(case1), funs(as.integer(.==1 ))) %<>%
mutate_at(vars(case2), funs(as.integer(.==2)))
df1
# A tibble: 6 x 20
# bhs1_1 bhs1_2 bhs1_3 bhs1_4 bhs1_5 bhs1_6 bhs1_7 bhs1_8 bhs1_9 bhs1_10
# <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#1 NA NA NA NA NA NA NA NA NA NA
#2 0 0 0 0 0 0 1 1 1 1
#3 NA NA NA NA NA NA NA NA NA NA
#4 1 0 1 1 0 1 1 1 0 0
#5 0 1 1 1 1 0 0 1 1 1
#6 1 1 1 1 1 1 1 1 1 1
# ... with 10 more variables: bhs1_11 <int>, bhs1_12 <int>, bhs1_13 <int>,
# bhs1_14 <int>, bhs1_15 <int>, bhs1_16 <int>, bhs1_17 <int>, bhs1_18 <int>,
# bhs1_19 <int>, bhs1_20 <int>
注意,这并不是假设所有值都是相同的,您可以使用非常快速的base R方法,如下所示:
case1=c("bhs1_10", "bhs1_11", "bhs1_12", "bhs1_13", "bhs1_14", "bhs1_15","bhs1_16", "bhs1_17", "bhs1_18", "bhs1_19", "bhs1_20")
case2=c("bhs1_1", "bhs1_3", "bhs1_5", "bhs1_6", "bhs1_8", "bhs1_10", "bhs1_13", "bhs1_15", "bhs1_19")
dat[case1]=abs(dat[case1]-2)
dat[case2]=dat[case2]-1
您可以使用一种非常快速的base R方法,如下所示:
case1=c("bhs1_10", "bhs1_11", "bhs1_12", "bhs1_13", "bhs1_14", "bhs1_15","bhs1_16", "bhs1_17", "bhs1_18", "bhs1_19", "bhs1_20")
case2=c("bhs1_1", "bhs1_3", "bhs1_5", "bhs1_6", "bhs1_8", "bhs1_10", "bhs1_13", "bhs1_15", "bhs1_19")
dat[case1]=abs(dat[case1]-2)
dat[case2]=dat[case2]-1
考虑到OP希望根据指定规则转换NA
,简单的ifelse
可能会有所帮助:
case1 = c("bhs1_2", "bhs1_4", "bhs1_7", "bhs1_9", "bhs1_11", "bhs1_12",
"bhs1_14", "bhs1_16", "bhs1_17", "bhs1_18", "bhs1_20")
case2 = c("bhs1_1", "bhs1_3", "bhs1_5", "bhs1_6", "bhs1_8", "bhs1_10",
"bhs1_13", "bhs1_15", "bhs1_19")
df[case1] = ifelse(!is.na(df[case1]) & df[case1]==1,1,0)
df[case2] = ifelse(!is.na(df[case2]) & df[case2]==2,1,0)
#Test solution
df[1:7]
# bhs1_1 bhs1_2 bhs1_3 bhs1_4 bhs1_5 bhs1_6 bhs1_7
# 1 0 0 0 0 0 0 0
# 2 0 0 0 0 0 0 1
# 3 0 0 0 0 0 0 0
# 4 1 0 1 1 0 1 1
# 5 0 1 1 1 1 0 0
# 6 1 1 1 1 1 1 1
**更新:*如果NA
保持原样,则解决方案可以是:
df[case1] = ifelse(df[case1]==1,1,0)
df[case2] = ifelse(df[case2]==2,1,0)
df[1:7]
# bhs1_1 bhs1_2 bhs1_3 bhs1_4 bhs1_5 bhs1_6 bhs1_7
# 1 NA NA NA NA NA NA NA
# 2 0 0 0 0 0 0 1
# 3 NA NA NA NA NA NA NA
# 4 1 0 1 1 0 1 1
# 5 0 1 1 1 1 0 0
# 6 1 1 1 1 1 1 1
考虑到OP希望根据指定规则转换NA
,简单的ifelse
可能会有所帮助:
case1 = c("bhs1_2", "bhs1_4", "bhs1_7", "bhs1_9", "bhs1_11", "bhs1_12",
"bhs1_14", "bhs1_16", "bhs1_17", "bhs1_18", "bhs1_20")
case2 = c("bhs1_1", "bhs1_3", "bhs1_5", "bhs1_6", "bhs1_8", "bhs1_10",
"bhs1_13", "bhs1_15", "bhs1_19")
df[case1] = ifelse(!is.na(df[case1]) & df[case1]==1,1,0)
df[case2] = ifelse(!is.na(df[case2]) & df[case2]==2,1,0)
#Test solution
df[1:7]
# bhs1_1 bhs1_2 bhs1_3 bhs1_4 bhs1_5 bhs1_6 bhs1_7
# 1 0 0 0 0 0 0 0
# 2 0 0 0 0 0 0 1
# 3 0 0 0 0 0 0 0
# 4 1 0 1 1 0 1 1
# 5 0 1 1 1 1 0 0
# 6 1 1 1 1 1 1 1
**更新:*如果NA
保持原样,则解决方案可以是:
df[case1] = ifelse(df[case1]==1,1,0)
df[case2] = ifelse(df[case2]==2,1,0)
df[1:7]
# bhs1_1 bhs1_2 bhs1_3 bhs1_4 bhs1_5 bhs1_6 bhs1_7
# 1 NA NA NA NA NA NA NA
# 2 0 0 0 0 0 0 1
# 3 NA NA NA NA NA NA NA
# 4 1 0 1 1 0 1 1
# 5 0 1 1 1 1 0 0
# 6 1 1 1 1 1 1 1
而且还是很有把握。为什么必须包含!is.na(.)
?谢谢您。在此上下文中,==1
和==2
是什么意思?@AtanasJanackovski
表示在mutate\u中选择的每个列值。相反,您还可以使用匿名函数函数(x)x==1
谢谢@akrun。如果我想在现场将这些转换为df,我会怎么做?也就是说,我只想将此转换应用于df中的某些列。而且还是很有把握。为什么必须包含!is.na(.)
?谢谢您。在此上下文中,==1
和==2
是什么意思?@AtanasJanackovski
表示在mutate\u中选择的每个列值。相反,您还可以使用匿名函数函数(x)x==1
谢谢@akrun。如果我想在现场将这些转换为df,我会怎么做?也就是说,我只想将此转换应用于df中的某些列。您希望如何处理数据中的NA
。@MKR,NA
应保持为NA
@akrun,不,只有1和2的值应该在那里。其他任何内容都将是NA
或错误,需要在运行此重新编码之前删除。您希望如何处理数据中的NA
。@MKR,NA
应保持为NA
@akrun,不,只有1和2的值应该在那里。其他任何内容都可能是NA
或错误,需要在运行此重新编码之前删除。这是第一个提供答案的内容,很高兴看到您提到了关于不考虑NA
的注释。谢谢。当你说你只是在测试我的病情时,你是什么意思?当您说it是“忽略NAs”时,您的意思是它将跳过它们吗?如果我想重新编码NAs(或其他值),我将如何处理?通过“仅测试”您的情况,我的意思是我没有使用ifelse
。是的,这是跳过NA的。如果要重新编码它们,需要使用is.na(变量名称)
进行测试。如何合并这些值取决于要用什么替换它们。@MelissaKey,为什么这些值会从数字变为真/假?这里的诀窍是,如果将真/假转换为数字,则“真->1”和“假->0”。因此,我执行了一个测试-(..==1)(数字等于1,返回TRUE/FALSE。而不是将其包装在Ifelse语句中以获得一个数字(我本可以这样做),我将其乘以1,这迫使R将布尔值转换为数字。非常高兴看到您提到了关于不考虑NA
。谢谢。当您说“只是测试”我的情况时,您是什么意思?当您说“忽略NAs”时,你的意思是它将跳过它们吗?如果我想重新编码NAs(或其他值),我将如何处理?通过“只是测试”你的情况,我的意思是我没有使用ifelse
。是的,这是跳过NA。如果你想重新编码它们,你需要使用is.NA(变量名称)来测试
。如何合并这些值取决于要用什么替换它们。@MelissaKey,为什么值会从数字变为真/假?这里的技巧是,如果将真/假转换为数字,则为真->1和假->0。因此,我执行了一个测试-(.==1)(数字等于1,返回TRUE/FALSE。而不是将其包装在Ifelse语句中以获取数字(我本可以这样做),我将其乘以1,这迫使R将布尔值转换为数字谢谢。这对于本用例来说似乎非常简单。是否需要先加载df?抱歉,还没有尝试过……只是想知道。dat
是您的df
ie data.frame。谢谢。对于本用例来说,这似乎非常简单。是否需要加载df优先?对不起,还没有试过…只是想知道。dat
是你的df
ie data.frame.Thank@MKR。事实上,我希望NAs
保持原样。抱歉,我应该说得更清楚。我该如何保持NAs
原样?我会修改我的答案以排除对NA的检查。谢谢@MKR