R 跨列的最后一个非空单元格

R 跨列的最后一个非空单元格,r,R,我试图在R中执行一个代码,它应该给我两个 如果所有三个单元格都是空的…它应该以空行形式跨列输出 如果其中一个单元格有值,则输出应为最后一个非空白单元格的值 数据: PR1 PR2 PR3 Required Output P1 P2 P2 P1 P2 P3 P3 P2 P4 P4 P3 P3 P2 P2 我试过这个: apply(df, 1, function(x) tail(na.omit(x), 1)) 但它没有满足第一

我试图在R中执行一个代码,它应该给我两个

如果所有三个单元格都是空的…它应该以空行形式跨列输出

如果其中一个单元格有值,则输出应为最后一个非空白单元格的值

数据:

PR1 PR2 PR3 Required Output

P1  P2      P2
P1  P2  P3  P3
    P2  P4  P4
    P3      P3
P2          P2
我试过这个:

apply(df, 1, function(x) tail(na.omit(x), 1))
但它没有满足第一个要求

这方面的任何帮助都将是巨大的。谢谢

连锁ifelse是一种方法

apply(data, 1, function(x) ifelse(sum(is.na(x)) == 3, "", tail(na.omit(x), 1)))
# Creating data set
pr1 <- as.character(c(NA, 'p1', 'p1', NA, NA, 'p2'))
pr2 <- as.character(c(NA, 'p2', 'p2', 'p2', 'p3', NA))
pr3 <- as.character(c(NA, NA, 'p3', 'p4', NA, NA))
pr_data <- data.frame(pr1, pr2, pr3)
pr_data <- data.frame(lapply(pr_data, as.character), stringsAsFactors=FALSE)
str(pr_data)

# Actual solution
pr_data$required_output <- ifelse(!is.na(pr_data$pr3), 
                                  pr_data$pr3, 
                                  ifelse(!is.na(pr_data$pr2), 
                                         pr_data$pr2, 
                                         pr_data$pr1)) 

以下解决方案使用is.na检查na与否,使用cumsum创建截至那时的na累积数,使用哪个.max查找最后一个非na值:

apply(pr_data, 1, 
    function(row_data) row_data[which.max(cumsum(!is.na(row_data)))])
例如,在一行上使代码看起来不像黑魔法

row_data = pr_data[5,]
#    pr1 pr2  pr3
# 5 <NA>  p3 <NA>
!is.na(row_data)
#     pr1  pr2   pr3
# 5 FALSE TRUE FALSE
cumsum(!is.na(row_data))
# [1] 0 1 1
which.max(cumsum(!is.na(row_data)))
# Returns the first occurence of the max value, which is the last non-NA value
row_data[which.max(cumsum(!is.na(row_data)))]
# The actual value
#   pr2
# 5  p3

下面是另一个base R方法,它使用max.col选择最终位置,rowSums和==检查行中的所有元素是否都是NA,最后是矩阵子集

# construct logical matrix of NA positions since it is (sort of) used twice
naMat <- is.na(pr_data)
# locate final non-NA position for each row
myOut <- max.col(!naMat, ties.method = "last")
# set NA to positions where all elements in row are NA
is.na(myOut) <- rowSums(naMat) == ncol(pr_data)
# use matrix to select desired elements from original data.frame
pr_data$out <- pr_data[cbind(seq_len(nrow(pr_data)), myOut)]
这是回报

pr_data
   pr1  pr2  pr3  out
1 <NA> <NA> <NA> <NA>
2   p1   p2 <NA>   p2
3   p1   p2   p3   p3
4 <NA>   p2   p4   p4
5 <NA>   p3 <NA>   p3
6   p2 <NA> <NA>   p2

您的数据实际上是什么样子的?无法从上面的内容中解读。我附上了数据的快照。ThanksIt可能有效,但它不是一个健壮的解决方案。如果你想用三列以上的列来做这个方法,你需要重写代码。这是一个公平的观点,尽管我不确定你为什么会说可能有效,因为我的解决方案在问题形成时确实产生了所需的输出。在不知道他的数据的实际细节的情况下,我们都不知道这是否有效。感谢您的输入。我确实应该删除这个选项。可能您已经展示了代码的工作原理,您是对的。用ncoldata和NA替换3,您就有了一个更通用的解决方案。很好,很好的解决方案。我没想到会这样使用which.max和cumsum。谢谢。但我仍然希望有一个更直观的解决方案,仍然看起来太像黑魔法了…@PaulHiemstra请删除你的评论:关于我的问题。或者至少删除文件的路径。谢谢