簡體   English   中英

R - 如何根據下一列中的值將數據框列中的值更改為 NA,對多對列執行?

[英]R - How do I change values in a column of a data frame to NA based on the value in the next column, performed on many pairs of columns?

我正在嘗試根據下一列中的相應值將數據框中的值設置為 NA。

這是一個示例,我試圖通過將 col1 和 col3 中的值分別與 col2 和 col4 進行比較來更新它們。 如果 col2 中的值小於 30,則 col1 中的值應為 NA(如果 col4 中的值小於 30,則 col3 也應如此)。 這是示例的控制台 output:

threshold <- 30L

df <- data.frame(col1 = floor(runif(4, 0, 100)),
                 col2 = floor(runif(4, 0, 100)),
                 col3 = floor(runif(4, 0, 100)),
                 col4 = floor(runif(4, 0, 100)))

#   col1 col2 col3 col4
# 1   84   71   18   52
# 2   42   89   25   19
# 3   93   17   28   59
# 4    6   21   88   35

df[, c(2, 4)] < threshold
#       col2  col4
# [1,] FALSE FALSE
# [2,] FALSE  TRUE
# [3,]  TRUE FALSE
# [4,]  TRUE FALSE

df_new <- data.frame(col1 = c(84, 42, NA, NA),
                     col2 = df$col2,
                     col3 = c(18, NA, 28, 88),
                     col4 = df$col4)

#   col1 col2 col3 col4
# 1   84   71   18   52
# 2   42   89   NA   19
# 3   NA   17   28   59
# 4   NA   21   88   35 

我的真實數據集有數千行和數百列,因此無法手動執行此操作。 我確實需要循環遍歷奇數/偶數對列(col1 和 col2、col3 和 col4 等),就像我在示例中所做的那樣。 我該怎么做呢?

您可以在未知數量的列中嘗試這種矢量化方法:

df[ind <- seq(1, ncol(df), 2)][df[ind+1] < threshold] <- NA #Thanks @Darren Tsai

或者這個循環:

for (i in seq(2, ncol(df), 2)) {
    df[,(i-1)] <- ifelse(df[,i] < threshold, NA, df[,(i-1)])
    }

結果 - 請注意,我將您的數據擴展到 8 列以進行測試

#  col1 col2 col3 col4 col5 col6 col7 col8
#1   28   94   55   67   24   88   NA   28
#2   NA    4   45   57    4   69   NA   14
#3   40   52   NA   10   32   64   54   96
#4   88   89   45   89   95   99   59   90

數據

threshold <- 30L
set.seed(123)
df <- data.frame(col1 = floor(runif(4, 0, 100)),
                 col2 = floor(runif(4, 0, 100)),
                 col3 = floor(runif(4, 0, 100)),
                 col4 = floor(runif(4, 0, 100)),
                 col5 = floor(runif(4, 0, 100)),
                 col6 = floor(runif(4, 0, 100)),
                 col7 = floor(runif(4, 0, 100)),
                 col8 = floor(runif(4, 0, 100)))

如果應根據偶數列更改奇數列,您還可以使用循環:

ncol <- ncol(df)
for (i in 1:ncol) {
  if (i %% 2 == 1) {
     df[,i] <- ifelse(df[,i + 1] < 30, NA, df[,i])
   }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM