如何从另一列插入值?

时间:2019-01-07 17:19:29

标签: r conditional-statements

我想用对应行另一列的值填充一个单元格。

我收到错误消息

Warning message:
In ukDataTest$s[is.na(ukDataTest$s) & !is.na(ukDataTest$s_2013)] <- ukDataTest$s_2013 :
  number of items to replace is not a multiple of replacement length

当我跑步时:

ukDataTest$s[is.na(ukDataTest$s) & !is.na(ukDataTest$s_2013)] <- ukDataTest$s_2013

我认为这是因为我实际上是在分配一整列值。

我想在ukDataTest $ s_2013的相应行上分配值。

我该怎么做?

示例数据:

library(dplyr)
number <- c(1,2,3,4,5)
s <- c(0.1,NA,0.5,NA,0.8)
s_2013 <- c(NA,0.3,NA,0.7,NA)
cbind(number,s,s_2013)

2 个答案:

答案 0 :(得分:1)

对于错误原因,您是正确的。解决方案是仅尝试替换另一列中的相应行,如

ukDataTest$s[is.na(ukDataTest$s) & !is.na(ukDataTest$s_2013)] <- ukDataTest$s_2013[is.na(ukDataTest$s) & !is.na(ukDataTest$s_2013)]

下面是一些玩具数据的例子

> dat <- data.frame(col1 = c(2, NA, 3, NA, 1, 1, NA, NA), 
+                   col2 = c(1, 1, NA, 2, 2, NA, NA, 4))
> 
> dat$col1
[1]  2 NA  3 NA  1  1 NA NA
> 
> dat$col1[is.na(dat$col1) & !is.na(dat$col2)] <- dat$col2[is.na(dat$col1) & !is.na(dat$col2)]
> 
> dat$col1
[1]  2  1  3  2  1  1 NA  4

或者,使用您在问题中发布的数据。

> number <- c(1,2,3,4,5)
> s <- c(0.1,NA,0.5,NA,0.8)
> s_2013 <- c(NA,0.3,NA,0.7,NA)
> 
> dat <- data.frame(number, s, s_2013)
> 
> dat$s[is.na(dat$s) & !is.na(dat$s_2013)] <- dat$s_2013[is.na(dat$s) & !is.na(dat$s_2013)]
> 
> dat$s
[1] 0.1 0.3 0.5 0.7 0.8

答案 1 :(得分:0)

现在它们的大小相同,并且每当is.na(ukDataTest $ s)和!is.na(ukDataTest $ s_2013)为true时,列s_2013的对应行值将分配给s。

    ukDataTest$s[is.na(ukDataTest$s) & !is.na(ukDataTest$s_2013)] <- ukDataTest$s_2013[is.na(ukDataTest$s) & !is.na(ukDataTest$s_2013)]