在data.frame中,我想创建一个为每行执行以下操作的函数:
我意识到第2步可以通过“动物园”中的na.locf()函数来完成。包,但我不确定如何编写一个可以回忆"哪些值最初是非NA的,所以我可以在最后一步用NA替换它们。类似地,识别每行中第一个或最后一个非NA的值是直截了当的,但是中间值让我感到茫然。这是代码
的示例#Example input
dm <- data.frame(rbind(c(NA,1,NA,NA,2,NA,NA,3),
c(1,1,NA,2,NA,3,3,3),
c(NA,NA,5,NA,NA,NA,6,NA)))
#Desired output
dm2 <- data.frame(rbind(c(NA,NA,1,1,NA,2,2,NA),
c(NA,NA,1,NA,2,NA,NA,NA),
c(NA,NA,NA,5,5,5,NA,6)))
> dm
X1 X2 X3 X4 X5 X6 X7 X8
1 NA 1 NA NA 2 NA NA 3
2 1 1 NA 2 NA 3 3 3
3 NA NA 5 NA NA NA 6 NA
> dm2
X1 X2 X3 X4 X5 X6 X7 X8
1 NA NA 1 1 NA 2 2 NA
2 NA NA 1 NA 2 NA NA NA
3 NA NA NA 5 5 5 NA 6
关于我的数据的更多信息 - 它由整数或NA值组成,如图所示。在每一行中,数值将保持不变,增加或为NA,但永远不会减少。从理论上讲,非NA值的数量可以从1到ncol不等。
我意识到这是一个相当具体的问题,非常感谢任何建议或帮助!
答案 0 :(得分:0)
由于您要遍历行而不是列(您应该转换或重塑数据的符号),因此需要比平时更多的努力才能将正确的data.frame或vector传递给tidyr::fill
或{ {1}},它将填充以下非zoo::na.locf
值。完成后,您可以简单地将NA
分配给新的data.frame,通过原始值的布尔掩码(不是NA
)。
NA
要求您传入data.frame并且仅适用于列,因此您需要转置data.frame以使用它。 tidyr
将进行转置,但它也会将数据转换为矩阵,因此需要t
进行转置,然后重新转置为原始形式。 data.frame(t(...))
是要填充的新列的规范;如果您不确定要调用的转置列,甚至X1:X3
,您可以在此使用dplyr::everything()
。
seq(nrow(dm))
使用dm2 <- data.frame(t(tidyr::fill(data.frame(t(dm)), X1:X3)))
dm2[!is.na(dm)] <- NA
dm2
## X1 X2 X3 X4 X5 X6 X7 X8
## X1 NA NA 1 1 NA 2 2 NA
## X2 NA NA 1 NA 2 NA NA NA
## X3 NA NA NA 5 5 5 NA 6
,您可以类似地使用其data.frame方法:
zoo::na.locf
或将其矢量方法与dm2 <- data.frame(t(zoo::na.locf(data.frame(t(dm)))))
dm2[!is.na(dm)] <- NA
:
apply
请注意,您需要将其dm2 <- data.frame(t(apply(dm, 1, zoo::na.locf, na.rm = FALSE)))
dm2[!is.na(dm)] <- NA
参数设置为na.rm
,以免丢失前导FALSE
。所有方法都返回相同的结果。
另请注意,对于第二行使用NA
实际上更安全(但对我而言不太可读):
is.na<-
这里的工作方式相同。