gpt4 book ai didi

根据 R 中的条件删除数据框列

转载 作者:行者123 更新时间:2023-12-04 22:44:10 24 4
gpt4 key购买 nike

我必须删除我的数据框中的列,它有 4000 多列和 180 行。我要设置的条件是删除数据框中的列:
(i) 如果该列中的值/条目少于两个,则删除该列
(ii) 如果没有两个连续(一个接一个),则删除该列
列中的值。
(iii) 删除所有值为 NA 的列。
我提供了删除列的条件。这里的目的不仅仅是像“如何删除 data.table 中的列?”那样按名称查找列。
我说明如下:

A       B    C   D  E
0.018 NA NA NA NA
0.017 NA NA NA NA
0.019 NA NA NA NA
0.018 0.034 NA NA NA
0.018 NA NA NA NA
0.015 NA NA NA 0.037
0.016 NA NA NA 0.031
0.019 NA 0.4 NA 0.025
0.016 0.03 NA NA 0.035
0.018 NA NA NA 0.035
0.017 NA NA NA 0.043
0.023 NA NA NA 0.040
0.022 NA NA NA 0.042

所需的数据帧:
A       E
0.018 NA
0.017 NA
0.019 NA
0.018 NA
0.018 NA
0.015 0.037
0.016 0.031
0.019 0.025
0.016 0.035
0.018 0.035
0.017 0.043
0.023 0.040
0.022 0.042

如何将这三个条件合并到一个代码中。我很感激你在这方面的帮助。
可重现的例子
structure(list(Month = c("Jan-2000", "Feb-2000", "Mar-2000", 
"Apr-2000", "May-2000", "Jun-2000"), A.G.L.SJ.INVS...LON..DEAD...13.08.15 = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), ABACUS.GROUP.DEAD...18.02.09 = c(0.00829384766220866,
0.00332213653674028, 0, 0, NA, NA), ABB.R..IRS. = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_)), .Names = c("Month",
"A.G.L.SJ.INVS...LON..DEAD...13.08.15", "ABACUS.GROUP.DEAD...18.02.09",
"ABB.R..IRS."), class = c("data.table", "data.frame"), row.names = c(NA,
-6L), .internal.selfref = <pointer: 0x0000000001c90788>)

最佳答案

我觉得这一切都过于复杂了。条件 2 已经包含所有其余条件,就好像至少有两个非 NA列中的值,显然整列不是 NA s。如果一列中至少有两个连续的值,那么显然这一列包含多个值。因此,而不是 3 个条件,这一切都总结为一个条件(我不希望每列运行多个函数,而是在每列运行 diff 之后-对整个事情进行矢量化):

cond <- colSums(is.na(sapply(df, diff))) < nrow(df) - 1

这是有效的,因为如果列中没有连续的值,整个列将变为 NA s。

那么,只要
df[, cond, drop = FALSE]
# A E
# 1 0.018 NA
# 2 0.017 NA
# 3 0.019 NA
# 4 0.018 NA
# 5 0.018 NA
# 6 0.015 0.037
# 7 0.016 0.031
# 8 0.019 0.025
# 9 0.016 0.035
# 10 0.018 0.035
# 11 0.017 0.043
# 12 0.023 0.040
# 13 0.022 0.042

根据您的编辑 , 好像你有一个 data.table对象,您还有一个 Date列,因此代码需要一些修改。
cond <- df[, lapply(.SD, function(x) sum(is.na(diff(x)))) < .N - 1, .SDcols = -1] 
df[, c(TRUE, cond), with = FALSE]

一些解释:
  • 我们想忽略计算中的第一列,因此我们指定 .SDcols = -1在我们的 .SD 上操作时(这意味着 S ub D ata in data.table 是)
  • .N只是行数(类似于 nrow(df)
  • 下一步是按条件进行子集化。我们也不必忘记捕获第一列,所以我们从 c(TRUE,... 开始
  • 最后,data.table默认情况下使用非标准评估,因此,如果您想像在 data.frame 中一样选择列您需要指定 with = FALSE


  • 不过,更好的方法是使用 := NULL 通过引用删除列。
    cond <- c(FALSE, df[, lapply(.SD, function(x) sum(is.na(diff(x)))) == .N - 1, .SDcols = -1])
    df[, which(cond) := NULL]

    关于根据 R 中的条件删除数据框列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34902809/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com