我正在使用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])
,但它们都不起作用。
如果有任何方法可以“切换”我的结果,请告诉我。任何帮助将不胜感激!
答案 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)]
)
如果您不熟悉管道运算符(%>%
),它会将前一个函数的结果作为下一个函数中的第一个参数传递。当你调用一个接一个的函数时,这是一种避免嵌套大量括号的方法。