为什么数据表上tolower()的输出会因其应用方式的不同而不同?

为什么数据表上tolower()的输出会因其应用方式的不同而不同?,r,R,我在所有字符类型字段的数据表上使用tolower()。当使用不同的语法应用于列时,我会得到不同的结果,这正常吗 tolower(tmp_dt[,1:5]) "c(\"case\", \"student\", \"of\", \"case\", \"case\", \"week\", \"of\")\ tolower(tmp_dt[,2]) "case" "student" "of" "case" "case" "week" "of" 我们需要在向量上应

我在所有字符类型字段的数据表上使用tolower()。当使用不同的语法应用于列时,我会得到不同的结果,这正常吗

 tolower(tmp_dt[,1:5])
 "c(\"case\", \"student\", \"of\", \"case\", \"case\", \"week\", \"of\")\
 tolower(tmp_dt[,2])
 "case"    "student" "of"      "case"    "case"    "week"    "of"

我们需要在
向量上应用
tolower
。根据
?tolower

x-字符向量,或可强制为字符的对象 凭我的性格

如果我们检查
tolower
,它调用
as.character
as.character
需要一个
向量
输入

as.character(tmp_dt[1:2])
#[1] "c(\"Student\", \"Case\", \"OF\", \"OF\", \"OF\")"      
#[2] "c(\"week\", \"Student\", \"week\", \"week\", \"Student\")"
如果我们选中
?as.character

此外,对于as.character,默认方法调用as.vector,因此 首先对as.character的方法进行分派,然后对as.character的方法进行分派 作为向量


一种方法是使用
lappy
循环遍历data.frame的列,应用
tolower
并将输出分配回data.frame列

tmp_dt[, 1:5]  <- lapply(tmp_dt[,1:5], tolower)
tmp_dt
#       V1      V2      V3   V4   V5   V6
#1 student    week      of week case   OF
#2    case student student case   of Case
#3      of    week      of case   of   OF
#4      of    week      of   of case   OF
#5      of student student case case Case
数据
set.seed(24)

tmp_dt,但随后它作为列表返回。我知道我可以用mapply实现我想要的结果,所以我并不是真的在寻找以小写形式获得结果的解决方案,我想知道为什么它会以这种方式返回结果。@Phi您是否有
data.frame
data.table
?我更新了这两个选项,它适用于我
mapply(tolower,tmp\u dt)
使用更简洁的语法处理data.table。我并不是想解决让托洛弗去上班的问题。我想了解为什么它会在“word”中返回数据format@Phi在我的帖子中已经提到,
tolower
需要一个向量,而不是data.frame或data.table作为输入。您可以使用
mappy
或lappy
,但是
mappy`返回一个
矩阵
,当
Map
lappy
输出大致相同时,它可能会产生问题。无论如何,关于
mapply()
你是对的,我应该说
as.data.table(tolower,tmp\u dt)
。我现在明白你的意思了,因为它期望一个向量。因此,导致不同输出的不是
tolower()
本身,而是
as.character()
library(data.table)
setDT(tmp_dt)[, (1:5) := lapply(.SD, tolower), .SDcols = 1:5]
set.seed(24)
tmp_dt <- as.data.frame(matrix(sample(c('Case', 'Student', 'OF', 'week'),
          5*6, replace = TRUE), 5, 6), stringsAsFactors=FALSE)