R- 从缺少数据 NA 的两个变量的子集中创建新的数据帧变量
R- create new dataframe variable from subset of two variables with missing data NA
我有一个简单的示例数据框,其中包含两个数据列(data1 和 data2)和两个分组变量(度量 1 和 2)。测量 1 和 2 有缺失数据 NA。
d <- data.frame(Measure1 = 1:2, Measure2 = 3:4, data1 = 1:10, data2 = 11:20)
d$Measure1[4]=NA
d$Measure2[8]=NA
d
Measure1 Measure2 data1 data2
1 1 3 1 11
2 2 4 2 12
3 1 3 3 13
4 NA 4 4 14
5 1 3 5 15
6 2 4 6 16
7 1 3 7 17
8 2 NA 8 18
9 1 3 9 19
10 2 4 10 20
我想创建一个包含 data1 的新变量 (d$new
),但仅限于 Measure1 等于 1 的行。我试过这个并得到以下错误:
d$new[d$Measure1 == 1] = d$data1[d$Measure1 == 1]
Error in d$new[d$Measure1 == 1] = d$data1[d$Measure1 == 1] : NAs
are not allowed in subscripted assignments
接下来,我只想将 data2 中 Measure2 等于 4 的行的数据添加到 d$new。但是,Measure1 和 Measure2 中缺失的数据会导致在对数据进行子集化并将其分配给新变量时出现问题.我可以想到一些过于复杂的解决方案,但我确信有一种我没有想到的简单方法。感谢您的帮助!
查找 Measure1 不是 NA 并且是您想要的值的行。
measure1_notNA = which(!is.na(d$Measure1) & d$Measure1 == 1)
使用一些默认值初始化您的新列。
d$new = NA
仅用 data1 列中的相应值替换那些行。
d$new[measure1_notNA] = d$data1[measure1_notNA]
或者,在 1 行中:
d$new[d$Measure1 == 1 & !is.na(d$Measure1)] = d$data1[d$Measure1 == 1 & !is.na(d$Measure1)]
根据描述,OP 似乎想要基于两列创建一个列 'new' 即当 Measure1==1 时,获取 'data1' 的相应元素,对于 Measure2 类似==4,得到对应的'data2'个值,其余用NA
。我们可以使用 ifelse
d$new <- with(d, ifelse(Measure1==1 & !is.na(Measure1), data1,
ifelse(Measure2==4, data2, NA)))
我们也可以通过分两步分配 (:=
) 来使用 data.table
来做到这一点。将 'data.frame' 转换为 'data.table' (setDT(d)
)。根据逻辑条件 (Measure1==1 & !is.na(Measure1)
),我们将列 'new' 分配为 'data1'。这将创建具有 'data1' 值的列,其中逻辑条件为 TRUE
,其余为 NA
。在第二步中,我们使用 'Measure2/data2'.
做同样的事情
library(data.table)
setDT(d)[Measure1==1 & !is.na(Measure1), new:= data1]
d[Measure2==4, new:= data2]
我有一个简单的示例数据框,其中包含两个数据列(data1 和 data2)和两个分组变量(度量 1 和 2)。测量 1 和 2 有缺失数据 NA。
d <- data.frame(Measure1 = 1:2, Measure2 = 3:4, data1 = 1:10, data2 = 11:20)
d$Measure1[4]=NA
d$Measure2[8]=NA
d
Measure1 Measure2 data1 data2
1 1 3 1 11
2 2 4 2 12
3 1 3 3 13
4 NA 4 4 14
5 1 3 5 15
6 2 4 6 16
7 1 3 7 17
8 2 NA 8 18
9 1 3 9 19
10 2 4 10 20
我想创建一个包含 data1 的新变量 (d$new
),但仅限于 Measure1 等于 1 的行。我试过这个并得到以下错误:
d$new[d$Measure1 == 1] = d$data1[d$Measure1 == 1]
Error in d$new[d$Measure1 == 1] = d$data1[d$Measure1 == 1] : NAs are not allowed in subscripted assignments
接下来,我只想将 data2 中 Measure2 等于 4 的行的数据添加到 d$new。但是,Measure1 和 Measure2 中缺失的数据会导致在对数据进行子集化并将其分配给新变量时出现问题.我可以想到一些过于复杂的解决方案,但我确信有一种我没有想到的简单方法。感谢您的帮助!
查找 Measure1 不是 NA 并且是您想要的值的行。
measure1_notNA = which(!is.na(d$Measure1) & d$Measure1 == 1)
使用一些默认值初始化您的新列。
d$new = NA
仅用 data1 列中的相应值替换那些行。
d$new[measure1_notNA] = d$data1[measure1_notNA]
或者,在 1 行中:
d$new[d$Measure1 == 1 & !is.na(d$Measure1)] = d$data1[d$Measure1 == 1 & !is.na(d$Measure1)]
根据描述,OP 似乎想要基于两列创建一个列 'new' 即当 Measure1==1 时,获取 'data1' 的相应元素,对于 Measure2 类似==4,得到对应的'data2'个值,其余用NA
。我们可以使用 ifelse
d$new <- with(d, ifelse(Measure1==1 & !is.na(Measure1), data1,
ifelse(Measure2==4, data2, NA)))
我们也可以通过分两步分配 (:=
) 来使用 data.table
来做到这一点。将 'data.frame' 转换为 'data.table' (setDT(d)
)。根据逻辑条件 (Measure1==1 & !is.na(Measure1)
),我们将列 'new' 分配为 'data1'。这将创建具有 'data1' 值的列,其中逻辑条件为 TRUE
,其余为 NA
。在第二步中,我们使用 'Measure2/data2'.
library(data.table)
setDT(d)[Measure1==1 & !is.na(Measure1), new:= data1]
d[Measure2==4, new:= data2]