如何同时保留和删除具有特定条件的列
How to keep and remove columns with certain condition simultaneously
我有 8 列变量,我必须保留第 1 到第 3 列。对于第 4 到第 8 列,我需要保留那些只有 3 个级别的变量并删除不符合该条件的变量。
我尝试了以下命令
data3 <- data2[,sapply(data2,function(col)length(unique(col)))==3]
它设法保留了 3 个级别的变量,但删除了我的前 3 列。
您可以分两步进行:
data4 <- data2[1:3]
#Your answer for the second part here:
data3 <- data2[,sapply(data2,function(col)length(unique(col)))==3]
merge(data3,data4)
根据您希望的预期输出,可以尝试使用 merge()
.
中的选项 all =TRUE
我建议另一种方法:
x = 1:3
cbind(data2[x], Filter(function(i) length(unique(i))==3, data2[-x]))
# 1 2 3 5
#1 a 1 3 b
#2 b 2 4 b
#3 c 3 5 b
#4 d 4 6 a
#5 e 5 7 c
#6 f 6 8 c
#7 g 7 9 c
#8 h 8 10 a
#9 i 9 11 c
#10 j 10 12 b
数据:
data2 = setNames(
data.frame(letters[1:10],
1:10,
3:12,
sample(letters[1:10],10, replace=T),
sample(letters[1:3],10, replace=T)),
1:5)
假设4:8列是factor
class,我们也可以用nlevels
到filter
列。我们创建 'toKeep' 作为要保留的列的数字索引,并创建 'toFilter' 作为 filter
的列的数字索引。我们将数据集分为两部分:1) 使用 'toKeep' 作为索引 (data2[toKeep]
),2) 使用 'toFilter',我们通过循环 sapply
进一步对数据集进行子集化要查找级别数 (nlevels
),请为 filter
列创建逻辑索引 (==3
),并为第一个子集创建 cbind
。
toKeep <- 1:3
toFilter <- setdiff(seq_len(ncol(data2)), n)
cbind(data2[toKeep], data2[toFilter][sapply(data2[toFilter], nlevels)==3])
# V1 V2 V3 V4 V6
#1 B B D C B
#2 B D D A B
#3 D E B A B
#4 C B E C A
#5 D D A D E
#6 E B A A B
数据
set.seed(24)
data2 <- as.data.frame(matrix(sample(LETTERS[1:5], 8*6, replace=TRUE), ncol=8))
我有 8 列变量,我必须保留第 1 到第 3 列。对于第 4 到第 8 列,我需要保留那些只有 3 个级别的变量并删除不符合该条件的变量。
我尝试了以下命令
data3 <- data2[,sapply(data2,function(col)length(unique(col)))==3]
它设法保留了 3 个级别的变量,但删除了我的前 3 列。
您可以分两步进行:
data4 <- data2[1:3]
#Your answer for the second part here:
data3 <- data2[,sapply(data2,function(col)length(unique(col)))==3]
merge(data3,data4)
根据您希望的预期输出,可以尝试使用 merge()
.
all =TRUE
我建议另一种方法:
x = 1:3
cbind(data2[x], Filter(function(i) length(unique(i))==3, data2[-x]))
# 1 2 3 5
#1 a 1 3 b
#2 b 2 4 b
#3 c 3 5 b
#4 d 4 6 a
#5 e 5 7 c
#6 f 6 8 c
#7 g 7 9 c
#8 h 8 10 a
#9 i 9 11 c
#10 j 10 12 b
数据:
data2 = setNames(
data.frame(letters[1:10],
1:10,
3:12,
sample(letters[1:10],10, replace=T),
sample(letters[1:3],10, replace=T)),
1:5)
假设4:8列是factor
class,我们也可以用nlevels
到filter
列。我们创建 'toKeep' 作为要保留的列的数字索引,并创建 'toFilter' 作为 filter
的列的数字索引。我们将数据集分为两部分:1) 使用 'toKeep' 作为索引 (data2[toKeep]
),2) 使用 'toFilter',我们通过循环 sapply
进一步对数据集进行子集化要查找级别数 (nlevels
),请为 filter
列创建逻辑索引 (==3
),并为第一个子集创建 cbind
。
toKeep <- 1:3
toFilter <- setdiff(seq_len(ncol(data2)), n)
cbind(data2[toKeep], data2[toFilter][sapply(data2[toFilter], nlevels)==3])
# V1 V2 V3 V4 V6
#1 B B D C B
#2 B D D A B
#3 D E B A B
#4 C B E C A
#5 D D A D E
#6 E B A A B
数据
set.seed(24)
data2 <- as.data.frame(matrix(sample(LETTERS[1:5], 8*6, replace=TRUE), ncol=8))