我有下一个数据帧:
df <- data.frame(Region = c("ES", "ES", "FRA", "FRA"),
Amount = c(1000,1200, 1100, 900))
其结构是:
'data.frame': 4 obs. of 2 variables:
$ Region: chr "ES" "ES" "FRA" "FRA"
$ Amount: num 1000 1200 1100 900
如果我在is.character()
上使用df$Region
功能,我会FALSE
,但如果我在apply()
使用相同的功能,我会TRUE
,甚至在第二列是一个数字。
使用的代码:
apply(df, 2, is.character)
Region Amount
TRUE TRUE
我不明白为什么会这样。
答案 0 :(得分:4)
apply
的文档说:
如果X不是数组而是具有非空昏暗值的类的对象(例如数据框),则应用尝试通过as.matrix将其强制转换为数组(如果它是二维的)(例如,数据框)或通过as.array。
as.matrix(df)
的结果是:
> as.matrix(df)
Region Amount
[1,] "ES" "1000"
[2,] "ES" "1200"
[3,] "FRA" "1100"
[4,] "FRA" " 900"
作为as.matrix
州的文档:
as.matrix是一个通用函数。如果只有原子列和任何非(数字/逻辑/复杂)列,将as.vector应用于因子并格式化为其他非字符列,则数据帧的方法将返回字符矩阵。
使用适用于lapply
列的data.frame
而不转换为矩阵时,您会得到正确的结果:
> lapply(df, is.character)
$Region
[1] FALSE
$Amount
[1] FALSE
答案 1 :(得分:2)
申请家庭可能有点令人困惑。
您可以使用map
中的purrr
tidyverse
来迭代。
这里我使用map_df
来返回数据框。
df <- data.frame(Region = c("ES", "ES", "FRA", "FRA"),
Amount = c(1000,1200, 1100, 900))
purrr::map_df(.x = df, .f = is.character)
#> # A tibble: 1 x 2
#> Region Amount
#> <lgl> <lgl>
#> 1 F F
您可以详细了解purrr
here。