首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据条件仅在数据帧列的子集中更改NA

根据条件仅在数据帧列的子集中更改NA
EN

Stack Overflow用户
提问于 2021-08-13 09:05:35
回答 2查看 41关注 0票数 1

我有来自多个数组的数据。我想更改仅属于存在部分数据的阵列的数据帧中的NAs。其他数据应该保持为NA。我有一个2数组的例子,但它可以是多个数组。

代码语言:javascript
复制
 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。

顺序不应该改变,因为它需要放回一个大的数据帧集中。

经过一段时间的尝试,我想出了这个:

代码语言:javascript
复制
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]}
} 
}
EN

回答 2

Stack Overflow用户

发布于 2021-08-13 09:16:55

你可以试试下面的代码

代码语言:javascript
复制
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)
    )
  }
)

这给了我们

代码语言:javascript
复制
> 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
票数 1
EN

Stack Overflow用户

发布于 2021-08-13 12:07:44

类似于@ThomasIsCoding在dplyr中的回答-

代码语言:javascript
复制
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     2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68769579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档