基于列 类 的列表内的子集数据框
Subset data frames inside of a list based on column classes
我有一个由数据框组成的非常大的列表,列表中的每个元素都是一个不同的数据框,其中每一列由不同类型的变量和不同长度的数据框组成。我想对该列表中的数据帧进行子集化,并仅保留那些具有 类 'integer' 或 'numeric' 的列,同时保持数据帧结构(因此看似没有 'lapply') .
MRE 如下:
x1 <- c(1,2,3,4)
y1 <- c(letters[1:4])
z1 <- as.integer(c(0, 1, 0, 1))
df1 <- data.frame(x1,y1,z1)
str(df1)
x2 <- c(0, 1, 2, 3,4 )
y2 <- as.integer(c(0, 1, 0, 1, 0))
z2 <- c(letters[1:5])
df2 <- data.frame(x2,y2,z2)
str(df2)
list12 <- list(df1, df2)
str(list12)
#the following have not worked or returned errors:
#list12<- sapply(list12, function (x) subset(x, select = class %in% c('character', 'factor'), drop =FALSE))
#Error in match(x, table, nomatch = 0L) :
# 'match' requires vector arguments
#list12 <- list12[sapply(list12, function(x) subset(x, select x %in% class is.numeric(x) || is.integer(x))]
#unexpected symbol
#list12 <- list12[, sapply(list12, function(x) is.numeric(x) || is.integer(x))]
# incorrect number of dimensions
#list12 <- sapply(list12, function(x) subset(x, select = class is.numeric(x) || is.integer(x))
#unexpected symbol
我的预期结果是一个包含 2 个数据框的列表,其中只有包含整数或数字的列 类
试一试:
lapply(list12,function(x) x[vapply(x,class,"") %in% c("integer","numeric")])
另一种选择是在 lapply
中使用 Filter
lapply(list12, Filter, f = is.numeric)
# [[1]]
# x1 z1
# 1 1 0
# 2 2 1
# 3 3 0
# 4 4 1
#
# [[2]]
# x2 y2
# 1 0 0
# 2 1 1
# 3 2 0
# 4 3 1
# 5 4 0
我喜欢大卫的回答 (+1),但使用 sapply()
对我来说更自然。
lapply(list12, function(x) x[sapply(x, is.numeric)])
我有一个由数据框组成的非常大的列表,列表中的每个元素都是一个不同的数据框,其中每一列由不同类型的变量和不同长度的数据框组成。我想对该列表中的数据帧进行子集化,并仅保留那些具有 类 'integer' 或 'numeric' 的列,同时保持数据帧结构(因此看似没有 'lapply') .
MRE 如下:
x1 <- c(1,2,3,4)
y1 <- c(letters[1:4])
z1 <- as.integer(c(0, 1, 0, 1))
df1 <- data.frame(x1,y1,z1)
str(df1)
x2 <- c(0, 1, 2, 3,4 )
y2 <- as.integer(c(0, 1, 0, 1, 0))
z2 <- c(letters[1:5])
df2 <- data.frame(x2,y2,z2)
str(df2)
list12 <- list(df1, df2)
str(list12)
#the following have not worked or returned errors:
#list12<- sapply(list12, function (x) subset(x, select = class %in% c('character', 'factor'), drop =FALSE))
#Error in match(x, table, nomatch = 0L) :
# 'match' requires vector arguments
#list12 <- list12[sapply(list12, function(x) subset(x, select x %in% class is.numeric(x) || is.integer(x))]
#unexpected symbol
#list12 <- list12[, sapply(list12, function(x) is.numeric(x) || is.integer(x))]
# incorrect number of dimensions
#list12 <- sapply(list12, function(x) subset(x, select = class is.numeric(x) || is.integer(x))
#unexpected symbol
我的预期结果是一个包含 2 个数据框的列表,其中只有包含整数或数字的列 类
试一试:
lapply(list12,function(x) x[vapply(x,class,"") %in% c("integer","numeric")])
另一种选择是在 lapply
Filter
lapply(list12, Filter, f = is.numeric)
# [[1]]
# x1 z1
# 1 1 0
# 2 2 1
# 3 3 0
# 4 4 1
#
# [[2]]
# x2 y2
# 1 0 0
# 2 1 1
# 3 2 0
# 4 3 1
# 5 4 0
我喜欢大卫的回答 (+1),但使用 sapply()
对我来说更自然。
lapply(list12, function(x) x[sapply(x, is.numeric)])