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!谢谢!如果您不介意的话,还有一个问题。由于我删除了数据的所有问题,当我尝试对清理后的数据运行回归时,仍然会出现以下错误:
对比中的错误