我在数据框中有一个存储列表的列。下面是一个示例:
echo
这是我用来生成上述示例的代码:
col
1 9
2 8, 8, 8, 5
3 1, 8, 10, 4
4 3, 6, 1, 6
5 9, 9, 10, 4
6 8, 8, 9, 2
7 6, 10, 4, 7
8 6, 1, 5, 9
9 4, 7, 5, 10
10 7, 9, 2, 5
我想从数据列表中此列的所有这些列表中删除所有出现的数字9,以得到如下内容:
set.seed(123)
example <- data.frame(matrix(NA_real_, nrow=10, ncol=1))
colnames(example) <- "col"
for(y in 1:10) {
example$col[y] <- list(c(c(sample(1:10,1)),c(sample(1:10,1)),c(sample(1:10,1)),c(sample(1:10,1))))
}
example$col[1] <- list(c(9))
与此相反,我目前正在使用 col
1 NA
2 8, 8, 8, 5
3 1, 8, 10, 4
4 3, 6, 1, 6
5 10, 4
6 8, 8, 2
7 6, 10, 4, 7
8 6, 1, 5
9 4, 7, 5, 10
10 7, 2, 5
example$col <- lapply(example$col, function(x){ x[x != 9] })
如何将 col
1 numeric(0)
2 8, 8, 8, 5
3 1, 8, 10, 4
4 3, 6, 1, 6
5 10, 4
6 8, 8, 2
7 6, 10, 4, 7
8 6, 1, 5
9 4, 7, 5, 10
10 7, 2, 5
替换为numeric(0)
,并且仍然能够删除所有9s?
答案 0 :(得分:3)
您可以同时执行以下操作,删除9s ,并用NA_real_
语句一步将单个9s更改为if
。
example$col <- lapply(example$col, function(x) {
if(length(x) == 1L && x == 9) NA_real_ else x[x != 9]
})
example
# col
# 1 NA
# 2 10, 1, 6
# 3 6, 5, 10, 5
# 4 7, 6, 2
# 5 3, 1, 4, 10
# 6 7, 7, 10
# 7 7, 8, 6, 6
# 8 3, 2, 10, 10
# 9 7, 8, 1, 5
# 10 8, 3, 4, 3
答案 1 :(得分:0)
像这样修改您的lapply
语句
lapply(example$col, function(x){ y <- x[x != 9]; if(length(y) < 1) { y <- NA }; y })
作为自己的功能-将来更容易修改
remove_num <- function(vec, num) {
x <- vec[vec != num]
if (length(x) < 1) { x <- NA }
x
}
lapply(example$col, remove_num, 9)