在r中设置Lappy循环内的级别

在r中设置Lappy循环内的级别,r,lapply,R,Lapply,我试图从尾随空间中清除数据帧中的因子变量。但是,级别分配在我的lappy函数中不起作用 rm.space<-function(x){ a<-gsub(" ","",x) return(a)} lapply(names(barn),function(x){ levels(barn[,x])<-rm.space(levels(barn[,x])) }) rm.spaceR是矢量化的,您不需要apply(): >f级(f) [1] “a”“b”“

我试图从尾随空间中清除数据帧中的因子变量。但是,级别分配在我的lappy函数中不起作用

rm.space<-function(x){
    a<-gsub(" ","",x)
    return(a)}


lapply(names(barn),function(x){
    levels(barn[,x])<-rm.space(levels(barn[,x]))
    })

rm.spaceR是矢量化的,您不需要
apply()

>f级(f)
[1] “a”“b”“c”“d”
>级别(f)级别(f)
[1] “a”“b”“c”“d”
>f
[1] d a c b c d a a a
级别:a b c d
>

R是矢量化的,您不需要
apply()

>f级(f)
[1] “a”“b”“c”“d”
>级别(f)级别(f)
[1] “a”“b”“c”“d”
>f
[1] d a c b c d a a a
级别:a b c d
>

从您的代码中,我了解到lappy用于在不同变量上循环,而不是在因子的级别上循环。因此,您确实需要某种循环结构,但lapply是一个糟糕的选择:

  • 你在一个向量名称(barn)上循环-所以最好使用sapply
  • apply族将返回每个循环的结果,这是您不想要的。所以你在毫无目的地使用记忆

无论如何,如果您需要在lappy中为全局环境中的某个变量赋值,您需要代码中的,我读到lappy用于在不同变量上循环,而不是在因子的级别上循环。因此,您确实需要某种循环结构,但lapply是一个糟糕的选择:

  • 你在一个向量名称(barn)上循环-所以最好使用sapply
  • apply族将返回每个循环的结果,这是您不想要的。所以你在毫无目的地使用记忆

无论如何,如果您需要在lappy中为全局环境中的变量赋值,您需要,因为Joris声明
lappy
数据的本地副本上工作。frame
,因此它不会修改您的原始数据。但您可以使用它来替换您的数据:

barn[] <- lapply(barn, function(x) {
    levels(x) <- rm.space(levels(x))
    x
    })

正如Joris所说,
lappy
data.frame
的本地副本上工作,因此它不会修改原始数据。但您可以使用它来替换您的数据:

barn[] <- lapply(barn, function(x) {
    levels(x) <- rm.space(levels(x))
    x
    })

你能提供一个可复制的例子吗?我用一些测试数据尝试了你的代码,lapply似乎工作得很好。你能澄清什么不起作用吗?你能提供一个可复制的例子吗?我用一些测试数据尝试了你的代码,lapply似乎工作得很好。你能解释一下什么不起作用吗?是的,R是矢量化的,但是删除空格并没有矢量化到数据帧中的不同变量上。这就是OP所需要的,我相信从他的代码中可以看出。没错,R是矢量化的,但删除空格并不是在数据帧中的不同变量上矢量化的。这就是OP需要的,我相信从他的代码来看。谢谢。我首先使用for循环,但受到所有书的鼓励,这些书都说所有的事情都应该在..apply框架内完成。我想我会尝试一下。。。我不知道@Misha:我知道for循环在R社区是不受欢迎的,特别是因为它们在全球环境中运行。apply系列避免了这种情况,使其在许多情况下使用更安全。然而,这里您希望在全局环境中工作,因此for循环是正确的工具。另见:Thx Joris。我首先使用for循环,但受到所有书的鼓励,这些书都说所有的事情都应该在..apply框架内完成。我想我会尝试一下。。。我不知道@Misha:我知道for循环在R社区是不受欢迎的,特别是因为它们在全球环境中运行。apply系列避免了这种情况,使其在许多情况下使用更安全。然而,这里您希望在全局环境中工作,因此for循环是正确的工具。另见:
> str(Df)
'data.frame':   10 obs. of  3 variables:
 $ X1: Factor w/ 3 levels "a","b","c": 2 3 1 1 1 2 3 2 2 2
 $ X2: Factor w/ 5 levels " a"," b"," c",..: 4 5 4 2 5 5 1 2 5 3
 $ X3: Factor w/ 5 levels "a","b","c","d",..: 2 3 4 1 4 1 3 3 5 4
for( i in c("X1","X3")){
    levels(Df[,i])<-gsub(" +","",levels(Df[,i]))
}
barn[] <- lapply(barn, function(x) {
    levels(x) <- rm.space(levels(x))
    x
    })
factors <- sapply(barn, is.factor)
barn[factors] <- lapply(barn[factors], function(x) {
                    levels(x) <- rm.space(levels(x))
                    x
                 })