簡體   English   中英

R子集/通過For Loop創建數據幀

[英]R subset/create a data frame by For Loop

我正在用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]) ,但它們都不起作用。 請讓我知道是否有任何方法可以“切換”我得到的結果。 任何幫助,將不勝感激!

這是使用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)]
  )

如果您不熟悉管道運算符( %>% ),則它將前一個函數的結果作為下一個函數的第一個參數傳遞。 當您依次調用一個函數時,這是避免嵌套大量括號的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM