我试图创建一个列表,每个会话一行,没有NA,每次点击一个元素,以应用点击流分析(马尔可夫链(。让我们假设我们有以下矩阵:
> sessions = rbind(c(1:3,NA,NA), c(1:2,NA,NA,NA), c(1:5))
> sessions
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 NA NA
[2,] 1 2 NA NA NA
[3,] 1 2 3 4 5
我的目标是创建矩阵外的";会话">一个列表没有NA,看起来像这样:
$Session1
[1] "1" "2" "3"
$Session2
[1] "1" "2"
$Session3
[1] "1" "2" "3" "4" "5"
由于我是R的新手,我不知道如何管理它。你有什么想法吗?如果有任何提示,我将非常高兴!
您可以使用split
res <- lapply(split(sessions, seq(nrow(sessions))),
function(x) as.numeric(na.omit(x)))
res
#$`1`
#[1] 1 2 3
#$`2`
#[1] 1 2
#$`3`
#[1] 1 2 3 4 5
或asplit
-
res <- lapply(asplit(sessions, 1), function(x) x[!is.na(x)])
要命名列表,可以使用-
names(res) <- paste0('session', seq_along(res))
我们可以在这里使用apply
(在R 4.1.0
上测试(
apply(sessions, 1, (x) x[complete.cases(x)])
[[1]]
[1] 1 2 3
[[2]]
[1] 1 2
[[3]]
[1] 1 2 3 4 5
也许你可以试试na.omit
> apply(sessions, 1, na.omit)
[[1]]
[1] 1 2 3
attr(,"na.action")
[1] 4 5
attr(,"class")
[1] "omit"
[[2]]
[1] 1 2
attr(,"na.action")
[1] 3 4 5
attr(,"class")
[1] "omit"
[[3]]
[1] 1 2 3 4 5