Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:什么是重新编码变量的有效方法?我如何按比例分配意味着什么?_R_Statistics_Recode - Fatal编程技术网

R:什么是重新编码变量的有效方法?我如何按比例分配意味着什么?

R:什么是重新编码变量的有效方法?我如何按比例分配意味着什么?,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),

我想知道是否有人能告诉我如何用相同的规则重新编码多个变量。我有以下df
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