r - 在 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 是否是累积的)。
为什么会发生此错误,解决此问题的最佳方法是什么?
解决方案
您的问题是作业的左侧和右侧的<-
长度不同。
## 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)]
推荐阅读
- python - Pygame 的运行方式与不同的 python 解释器不同
- r - Tidymodels:使用 R 中的函数 tune_grid() 进行 10 倍交叉验证的可调模型
- java - 在 maven pom.xml 中更改传递依赖项的版本
- css - Flexbox 容器不包括 margin-bottom
- html - 我无法理解错误是什么?
- javascript - 有没有办法向已经初始化的指标添加新标签?
- java - 无法反序列化 `java.util.ArrayList 的实例
` 在 [Source: (BufferedInputStream); 的 START_OBJECT 标记之外 行:1,列:1] - google-apps-script - Google 为组织外的特定服务编写 Web 应用权限脚本
- c# - 如果找到特定值,则读取 .txt 文件,然后返回
- java - GWT 应用程序编译问题 - 错误,状态 503