[英]I have a data frame with 10 columns and thousand of rows. I want to replace 4th column (value<=0.05) with NA. How can I do this using R script
[英]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.