R 如何删除循环中有一个唯一变量的列?
以下是我迄今为止所做的:R 如何删除循环中有一个唯一变量的列?,r,loops,R,Loops,以下是我迄今为止所做的: testdf=olddf; for (i in colnames(testdf)) if (length(unique(testdf[,i]))==1){ testdf[,-(i)] } 我无法使上述代码正常工作。有人能帮我解释一下我做错了什么吗?从本质上说,我试图以某种方式创建一个循环,以便检查每一列,以确保没有唯一的数据。例如,如果列长度等于1,则必须将其删除 非常感谢,要使其正常工作,您需要重新分配testdf变量。目前您只需选择
testdf=olddf;
for (i in colnames(testdf))
if (length(unique(testdf[,i]))==1){
testdf[,-(i)]
}
我无法使上述代码正常工作。有人能帮我解释一下我做错了什么吗?从本质上说,我试图以某种方式创建一个循环,以便检查每一列,以确保没有唯一的数据。例如,如果列长度等于1,则必须将其删除
非常感谢,要使其正常工作,您需要重新分配
testdf
变量。目前您只需选择它。i、 e,将testdf[,-(i)]
替换为testdf%select\u if(~length(unique(.))>1)
mpg显示hp drat wt qsec与am齿轮carb
1 21.0 160.0 110 3.90 2.620 16.46 0 1 4 4
2 21.0 160.0 110 3.90 2.875 17.02 0 1 4 4
3 21.4 258.0 110 3.08 3.215 19.44 1 0 3 1
4 18.1 225.0 105 2.76 3.460 20.22 1 0 3 1
5 19.2 167.6 123 3.92 3.440 18.30 1 0 4 4
6 17.8 167.6 123 3.92 3.440 18.90 1 0 4 4
7 19.7 145.0 175 3.62 2.770 15.50 0 1 5 6
在较高级别上,要使其工作,您需要重新分配testdf
变量。目前您只需选择它。i、 e,将testdf[,-(i)]
替换为testdf%select\u if(~length(unique(.))>1)
mpg显示hp drat wt qsec与am齿轮carb
1 21.0 160.0 110 3.90 2.620 16.46 0 1 4 4
2 21.0 160.0 110 3.90 2.875 17.02 0 1 4 4
3 21.4 258.0 110 3.08 3.215 19.44 1 0 3 1
4 18.1 225.0 105 2.76 3.460 20.22 1 0 3 1
5 19.2 167.6 123 3.92 3.440 18.30 1 0 4 4
6 17.8 167.6 123 3.92 3.440 18.90 1 0 4 4
7 19.7 145.0 175 3.62 2.770 15.50 0 1 5 6
不能使用-operator为字符列名编制索引。一种方法是使用。这应该适用于你的情况
for (i in colnames(testdf)) {
if (length(unique(testdf[,i])) == 1) {
testdf<- testdf[,-which(colnames(testdf) == i) ]
}
}
for(i在colnames(testdf)中){
if(长度(唯一(testdf[,i]))==1){
testdf您不能使用-operator为字符列名编制索引。一种方法是使用which。这应该适用于您的情况
for (i in colnames(testdf)) {
if (length(unique(testdf[,i])) == 1) {
testdf<- testdf[,-which(colnames(testdf) == i) ]
}
}
for(i在colnames(testdf)中){
if(长度(唯一(testdf[,i]))==1){
testdf在R中,如果可以的话,最好避免for循环。不是说它们应该一起避免,而是向量化操作往往更快。在这种情况下,sapply
是您的朋友
df = data.frame(v1=sample(letters, 10), v2=sample(1:100, 10), v3=4, v4=sample(LETTERS, 10))
x = sapply(names(df), function(x) length(unique(df[[x]])) > 1)
df[, x]
# v1 v2 v4
# 1 e 82 P
# 2 i 45 T
# 3 z 76 W
# 4 u 27 Y
# 5 n 2 Q
# 6 x 72 B
# 7 o 61 O
# 8 d 47 R
# 9 s 42 G
# 10 k 66 S
更新(基于评论中的对话)
在R中,如果可以,最好避免for循环。并不是说它们应该一起避免,而是向量化操作往往更快。在这种情况下,sapply
是您的朋友
df = data.frame(v1=sample(letters, 10), v2=sample(1:100, 10), v3=4, v4=sample(LETTERS, 10))
x = sapply(names(df), function(x) length(unique(df[[x]])) > 1)
df[, x]
# v1 v2 v4
# 1 e 82 P
# 2 i 45 T
# 3 z 76 W
# 4 u 27 Y
# 5 n 2 Q
# 6 x 72 B
# 7 o 61 O
# 8 d 47 R
# 9 s 42 G
# 10 k 66 S
更新(基于评论中的对话)
感谢您的及时回复Zack。当我运行以下命令时:testdf=olddf;for(I in 1:dim(test2)[2])if(length(unique(test2[,I])==1){testdf=testdf[,I]}
我得到以下错误:错误in
[.data.frame(testdf,I):未定义选定的列
当您删除for循环中的列时,可能发生的情况与我提到的相同。您最终会减少data.frame的宽度,当您通过循环足够远时,您会尝试引用不再存在的列索引。是否要修复我的初始代码?我尝试了您的dplyr但它对我不起作用。谢谢你的及时回复Zack。当我运行以下命令时:testdf=olddf;for(I in 1:dim(test2)[2])if(length(unique(unique(test2[,I])==1{testdf=testdf[,I]}
我得到以下错误:error in
[.data.frame(testdf,I]):未定义选定的列
当您删除for循环中的列时,可能发生的情况与我提到的相同。您最终会减少data.frame的宽度,当您通过循环足够远时,您会尝试引用不再存在的列索引。是否要修复我的初始代码?我尝试了您的dplyr,但它对我不起作用。没关系,它起作用了!我的小括号放错了地方!谢谢!如果你不介意的话,还有一个问题。由于我删除了数据的所有问题,当我尝试对清理后的数据进行回归时,我仍然会遇到以下错误:错误,不管它起作用了!我的小括号放错了place!谢谢!如果您不介意的话,还有一个问题。由于我删除了数据的所有问题,当我尝试对清理后的数据运行回归时,仍然会出现以下错误:对比中的错误