R子集/通过For循环创建数据帧

时间:2018-04-20 18:44:53

标签: r for-loop dataframe datatable

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

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]),但它们都不起作用。 如果有任何方法可以“切换”我的结果,请告诉我。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

这是使用tidyverse套件的解决方案。 (这不是for-loop,对不起)。

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)]
  )

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