我有来自多个数组的数据。我想更改仅属于存在部分数据的阵列的数据帧中的NAs。其他数据应该保持为NA。我有一个2数组的例子,但它可以是多个数组。
data_frame = data.frame(
col1 = c(111,232,12,NA, NA, NA, NA, NA, NA, NA,NA,NA),
col2 = c(NA,NA,NA,4,50,800,NA,NA,NA,NA,NA,NA),
col3 = c(NA,NA,NA,NA,NA,NA,NA,NA,NA,20,3,500),
ARRAY = c(1,1,1,2,2,2,1,1,1,2,2,2))因此,在col1中替换了第7-9行中的NAs,在col2中替换了第10-12行中的NAs,在col3第4-6行中替换了NAs。

我试着找出哪些行和列使用哪个(!is.na(Data_frame),arr.ind = TRUE)来存储数据,但是我被卡住了。这对于任何脚本都应该是通用的,其中我有多个阵列,并且希望仅在阵列有部分数据时才更改NAs。
顺序不应该改变,因为它需要放回一个大的数据帧集中。
经过一段时间的尝试,我想出了这个:
for (j in 1:3){
A <- as.data.frame(df[,j])
NonNAindex <- which(!is.na(A))
NonNA <- min(NonNAindex)
ARRAY <- df[firstNonNA,ncol(df)]
for (r in 1:nrow(df)){
if (is.na(df[r,j]) & df[r,4]==ARRAY) {df[r,j] <- 0}
else{df[r,j] <- df[r,j]}
}
}发布于 2021-08-13 09:16:55
你可以试试下面的代码
df[-4] <- lapply(
df[-4],
function(x) {
ave(x,
df$ARRAY,
FUN = function(v) if (all(is.na(v))) NA else replace(v, is.na(v), 1)
)
}
)这给了我们
> df
col1 col2 col3 ARRAY
1 111 NA NA 1
2 232 NA NA 1
3 12 NA NA 1
4 NA 4 1 2
5 NA 50 1 2
6 NA 800 1 2
7 1 NA NA 1
8 1 NA NA 1
9 1 NA NA 1
10 NA 1 20 2
11 NA 1 3 2
12 NA 1 500 2发布于 2021-08-13 12:07:44
类似于@ThomasIsCoding在dplyr中的回答-
library(dplyr)
data_frame %>%
group_by(ARRAY) %>%
mutate(across(starts_with('col'),
~if(all(is.na(.))) NA else replace(., is.na(.), 1))) %>%
ungroup
# col1 col2 col3 ARRAY
# <dbl> <dbl> <dbl> <dbl>
# 1 111 NA NA 1
# 2 232 NA NA 1
# 3 12 NA NA 1
# 4 NA 4 1 2
# 5 NA 50 1 2
# 6 NA 800 1 2
# 7 1 NA NA 1
# 8 1 NA NA 1
# 9 1 NA NA 1
#10 NA 1 20 2
#11 NA 1 3 2
#12 NA 1 500 2https://stackoverflow.com/questions/68769579
复制相似问题