【问题标题】:R: delete columns from data.frame if condition fulfilledR:如果条件满足,则从 data.frame 中删除列
【发布时间】:2018-07-22 17:41:41
【问题描述】:

我有一个大约有一个 data.frame。 20,000 列。从这个 data.frame 中,我想删除跟随向量值为 1 的列。

u.snp <- apply(an[25:19505], 2, mean)

我确信必须有一个直接的方法来实现这一点,但现在看不到它。任何提示将不胜感激。谢谢。

更新:感谢您的帮助。现在我尝试了以下方法:

cm <- colMeans(an.mdr[25:19505])
tail(sort(cm), n=40)

使用 tail 函数,我看到 an.mdr 的 19481 列中有 22 列的均值 = 1。接下来,我使用建议的代码删除这些列。

an.mdr.s <- an.mdr
an.mdr.s[colMeans(an.mdr.s[25:19505])==1] <- NULL

正如预期的那样,an.mdr.s 比 an.mdr 少 22 列。但是,当我计算除前 24 列之外的所有列的平均值时,我在 an.mdr.s 中再次有 22 列平均值 = 1。

cmm <- colMeans(an.mdr.s[25:19483])
tail(sort(cmm), n=40)

老实说,我现在看不到这里发生了什么。

【问题讨论】:

  • 您想删除所有均值为 1 的列。对吧?
  • 是的,正是……
  • 如果您认为某个答案解决了问题,请单击绿色复选标记将其标记为“已接受”。这有助于将注意力集中在仍然没有答案的旧 SO。
  • @user102546 不知道为什么您在问题中提到了an[25:19505]。如果您想删除任何具有1 平均值的列,那么最好稍微修改您的问题,使其与答案匹配。谢谢。

标签: r data-management


【解决方案1】:

使用以下命令应该很容易完成:

df[colMeans(df)==1] <- NULL

【讨论】:

  • 感谢您的帮助。按照建议删除列后,我遇到了另一个问题(请参阅上面我编辑的帖子)。你能发现我犯的错误吗?谢谢。
  • 我看到您使用了an.mdr.s[colMeans(an.mdr.s[25:19505])==1] &lt;- NULL 而不是an.mdr.s[colMeans(an.mdr.s)==1] &lt;- NULL。您的目标是保留前 24 列吗?另外,您的数据集中有 19505 列吗?
  • 如果上述情况属实,并且您确实希望保留直到第 24 列和第 19506 列以及之后的列,并删除中间的列,平均值为 1,您可以尝试 @987654324 @。这将创建一个长度为ncol(an.mdr.s) 的向量,其中包含平均值为1 的列TRUE,其他列为FALSE;然后它会强制最高 24 和 19506 之后的 TRUE。使用该向量,您可以执行an.mdr.s[sel.col] &lt;- NULL
  • 我想保留前 24 列,而不管它们的值如何,因为它们包含元数据并且不用作逻辑回归模型中的自变量。该数据集共有 19505 列。
  • 好的。 sel.col &lt;- an.mdr.s %&gt;% colMeans %&gt;% equals(1) %&gt;% inset(c(1:24), F)an.mdr.s[sel.col] &lt;- NULL 能实现你的目标吗?请注意,您需要library(magrittr)
【解决方案2】:

您可以通过两个简单的步骤来完成(df 是您的数据框):

# step 1 - calculate mean for all columns and filter with mean = 1
remove_columns <- sapply(df, mean)
remove_columns <- names(remove_columns[remove_columns == 1])

# alternate using filter (just for knowledge)
## remove_columns <- names(Filter(function(x) x == 1,sapply(df, mean)))

# step 2 - remove them
df_new <- df[,setdiff(names(df), remove_columns)]

【讨论】:

    猜你喜欢
    • 2015-10-13
    • 2020-09-11
    • 2015-10-18
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 2014-05-22
    相关资源
    最近更新 更多