以下是一些示例数据。
vv var1 var2
1 a 1/1/2010
1 c 1/3/2010
2 d 1/6/2010
3 a 1/8/2010
3 c 1/9/2010
4 a 1/10/2010
4 b 1/11/2010
5 d 1/13/2010
6 a 1/16/2010
6 b 1/17/2010
7 a 1/19/2010
7 b 1/20/2010
8 d 1/22/2010
9 a 1/25/2010
9 c 1/27/2010
我正在尝试创建新变量,由其他变量的响应填充。我觉得这很容易。例如,我尝试过类似下面的内容。
data$new1[data$var1=="a"]<-data$var2
#or
data$new1[data$var1=="b" | data$var1=="c"]<-data$var2
我收到错误number of items to replace is not of replacement length
。在我的数据中,并非每个var1=="a"
都有var2
值,所以我不确定为什么r不只是为缺失值分配NA,这是我可以接受的(实际上更喜欢它) 。基本上,我希望r为任何new1
提供var1!="a"
NA值。
我也试过
if (data$var1=="a") {data$new1<-data$var2} else {data$new1<-"NA"}
但我收到错误the condition has length > 1 and only the first element will be used
。
现在,我想我可以将我的数据子集化为仅包含var1=="a"
的数据,然后分配我的值,然后使用all=T
选项合并回主数据集以获取NA的估算,但我真的想避免这样做。
我不确定问题是什么。任何建议都非常感谢。欢呼声。
以下方法输出以运行代码:
data$new1 <- ifelse(data$var1 %in% c("b","c"),data$var2,NA)
vv var1 var2 new1
1 1 a 1/1/2010 NA
2 1 c 1/3/2010 12
3 2 d 1/6/2010 NA
4 3 a 1/8/2010 NA
5 3 c 1/9/2010 15
6 4 a 1/10/2010 NA
7 4 b 1/11/2010 3
8 5 d 1/13/2010 NA
9 6 a 1/16/2010 NA
10 6 b 1/17/2010 6
11 7 a 1/19/2010 NA
12 7 b 1/20/2010 8
13 8 d 1/22/2010 NA
14 9 a 1/25/2010 NA
15 9 c 1/27/2010 11
答案 0 :(得分:1)
由于您尚未提供样本数据,因此此代码未经测试
data$new1 <- rep(NA, nrow(data))
data$new1[data$var1=="A"] <- data$var2[data$var1=="A"]
此处的关键是为data$var1=="A"
和data$new1
设置相同的子集参数(data$var2
)。
这种方法的优点是子集不必只是相等而是任何逻辑表达式。
答案 1 :(得分:1)
如果我理解正确,我认为您希望使用ifelse
和%in%
来执行此任务:
data$new1 <- ifelse(data$var1 %in% c("A","B"),data$var2,NA)
你所执行的是子集化,它通常会返回更小的值,因此会出现警告。