R-如何将sapply循环的输出分配给数据框中的原始列而不会丢失其他列



i一个具有不同列的数据框架,这些列有不同评估者的字符串答案,他们在答案中使用了随机的上或较低情况。我想将所有内容转换为较低的情况。我有一个适用如下的代码:

# Creating a reproducible data frame similar to what I am working with
dfrm <- data.frame(a = sample(names(islands))[1:20],
               b = sample(unname(islands))[1:20],
               c = sample(names(islands))[1:20],
               d = sample(unname(islands))[1:20],
               e = sample(names(islands))[1:20],
               f = sample(unname(islands))[1:20],
               g = sample(names(islands))[1:20],
               h = sample(unname(islands))[1:20])
# This is how I did it originally by writing everything explicitly:
dfrm1 <- dfrm
dfrm1$a <- tolower(dfrm1$a)
dfrm1$c <- tolower(dfrm1$c)
dfrm1$e <- tolower(dfrm1$e)
dfrm1$g <- tolower(dfrm1$g)
head(dfrm1) #Works as intended

问题在于,随着评估人员的数量增加,我一直在犯复制糊错误。我试图通过编写tolower的函数来简化代码,并使用sapply将其循环,但是最终的数据框架看起来不像我想要的:

# function and sapply:
dfrm2 <- dfrm
my_list <- c("a", "c", "e", "g")
my_low <- function(x){dfrm2[,x] <- tolower(dfrm2[,x])}
sapply(my_list, my_low) #Didn't work
# Alternative approach:
dfrm2 <- as.data.frame(sapply(my_list, my_low))
head(dfrm2) #Lost the numbers

我缺少什么?

我知道这一定是我没有得到的一个非常基本的概念。我根本无法遵循这个问题和答案,而我的非工作解决方案似乎根本起作用。任何帮助,感谢!

也许您想创建一个逻辑向量,该向量选择只能通过这些列来更改并运行应用功能。

# only choose non-numeric columns
changeCols <- !sapply(dfrm, is.numeric)
# change values of selected columns to lower case
dfrm[changeCols] <- lapply(dfrm[changeCols], tolower)

如果您有其他类型的列,例如逻辑,那么对于要更改的列的类型,您也可能更明确。例如,仅选择因子和字符列,请使用。

changeCols <- sapply(dfrm, function(x) is.factor(x) | is.character(x))

对于您的第一次尝试,如果您希望将分配给数据框dfrm2粘贴,请使用<<-分配操作员:

my_low <- function(x){ dfrm2[,x] <<- tolower(dfrm2[,x]) }
sapply(my_list, my_low)

demo

相关内容

最新更新