R 跨列的最后一个非空单元格
我试图在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)) 但它没有满足第一
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请删除你的评论:关于我的问题。或者至少删除文件的路径。谢谢