首页 > 解决方案 > 在 R 中创建新变量 - 缺少数据的问题

问题描述

我一直在我的 R 代码中遇到一个问题,即根据另一个变量生成一个新变量。每个参与者都有多个不同变量的条目。并非所有这些变量对每个参与者都很重要。我有一个虚拟编码变量,用来告诉我在生成新变量时应该使用哪个变量。这是我的数据的样子。

data
id use v1 v2 v3
1  1   2  2  1  
2  2   NA 1  2 
3  3   1  NA 3
4  1   3  5  NA
5  2   4  4  1

我将尝试使用虚拟编码变量创建一个新变量。对于这个例子,使用是 1,我想使用 v1 的值作为 x。如果 use 是 2,那么我想为 x 使用 v2。如果 use 是 3,我想为 x 使用 v3。这是我使用的代码。

data$x [data$use == 1] <- data$v1
data$x [data$use == 2] <- data$v2
data$x [data$use == 3] <- data$v3

当我尝试运行代码时,我会收到错误消息“要替换的项目数不是替换长度的倍数”。

我做了一些研究,我认为这与数据丢失有关(尽管我可能是错的)。我尝试在 [] 中使用 is.na () 但这并不能解决问题。

我以前用 ifelse 解决过类似的问题,但我不认为代码在这种情况下会起作用,因为我有两种以上的情况(我不确定 ifelse 是否是累积的)。

为什么会发生此错误,解决此问题的最佳方法是什么?

标签: rvariablesrecode

解决方案


您的问题是作业的左侧和右侧的<-长度不同。

## data$x[data$use == 1] <- data$v1

data$x[data$use == 1]
#[1] 2 3

data$v1
#[1]  2 NA  1  3  4

如果你通过选择两边来匹配它们,你在笑:

data$x[data$use == 1] <- data$v1[data$use == 1]
data$x[data$use == 2] <- data$v2[data$use == 2]
data$x[data$use == 3] <- data$v3[data$use == 3]

#  id use v1 v2 v3 x
#1  1   1  2  2  1 2
#2  2   2 NA  1  2 1
#3  3   3  1 NA  3 3
#4  4   1  3  5 NA 3
#5  5   2  4  4  1 4

您可以避免需要编写多行并使用矩阵索引对任意数量的变量进行这项工作,但是根据我之前的回答:https ://stackoverflow.com/a/33862219/496803

data[c("v1","v2","v3")][cbind(seq_len(nrow(data)), data$use)]
#[1] 2 1 3 3 4

这实质上是使用matrix带有行和列索引的 a 从v1-3变量中获取正确的值:

cbind(seq_len(nrow(data)), data$use)
##    row  col
#     [,1] [,2]
#[1,]    1    1
#[2,]    2    2
#[3,]    3    3
#[4,]    4    1
#[5,]    5    2


## assign it get the same result obviously:
data$x <- data[c("v1","v2","v3")][cbind(seq_len(nrow(data)), data$use)]

推荐阅读