【问题标题】:R subset/create a data frame by For LoopR 子集/通过 For 循环创建数据框
【发布时间】:2018-04-20 18:44:53
【问题描述】:

我正在使用 R 进行 For 循环,以获取每行的最后一个非 NA 值。我将不得不使用 For 循环。我的数据如下:

col1      col2      col3      col4
 A        NA         NA        NA
 B         C         NA        NA
 D         E         F         NA   

到目前为止我尝试过的是:

for (i in 1:nrow(df)){
  index <- as.numeric(max(which(!is.na(df[i,]))))
  product <- df[i, .SD, .SDcols = index]
  print(product )
}

那么 R 给出的结果为:

    col1
  1:A
    col2
  1:C
    col3
  1:F

但我真正想要的是如下表:

Product ColName
  A      col1
  C      col2
  F      col3

我尝试了as.data.table(df[i, .SD, .SDcols = index])as.data.frame(df[i, .SD, .SDcols = index]),但它们都不起作用。 请让我知道是否有任何方法可以“切换”我的结果。任何帮助将不胜感激!

【问题讨论】:

  • 那么你真的想要一个data.frame/data.table吗?或者只是打印时看起来像这样的东西?如果您最终想要一个对象,那么使用 forloop 是一个糟糕的主意。为什么你“必须”使用一个?如果这是一个家庭作业问题,那么你应该向你的老师寻求帮助。如果需要循环,他们显然会考虑一些非标准的 R 解决方案。这样的解决方案不会帮助该站点上的其他 R 用户。
  • 所有列的数据类型是否相同?如果是这样转置,lapply,过滤掉NA,取最后一个条目。 ......请!不要使用 for 循环
  • @MrFlick 嗨,非常感谢您的回复。我想使用 for 循环,因为我有一个非常大的数据集。我想得到一个表格,就像我在问题中显示的那样,稍后它会链接到其他一些东西。
  • @RussHyde 非常感谢您的建议!我正在使用 for 循环,因为这是我想到的唯一方法。只是想知道你介意分享一个更详细的方法来解决这个问题吗?就像 lapply 部分。谢谢!

标签: r for-loop dataframe datatable


【解决方案1】:

这是使用 tidyverse 套件的解决方案。 (这不是 for 循环,抱歉)。

library(tidyverse)
result <- df %>%
  mutate(row_num = 1:n()) %>%
  gather(ColName, Product, -row_num, na.rm = TRUE) %>%
  mutate(col_num = str_match(ColName,"\\d+$")) %>%
  group_by(row_num) %>%
  summarize(
    Product = Product[which.max(col_num)],
    ColName = ColName[which.max(col_num)]
  )

如果您不熟悉管道运算符 (%&gt;%),它会将前一个函数的结果作为下一个函数的第一个参数传递。这是一种避免在一个接一个地调用函数时嵌套大量括号的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    相关资源
    最近更新 更多