sapply()当用于字符向量时,会出现奇怪的行为:
y <- c("Hello", "bob", "daN")
z <- sapply(y, function(x) {toupper(x)})
z
# Hello bob daN
# "HELLO" "BOB" "DAN"
str(z)
# Named chr [1:3] "HELLO" "BOB" "DAN"
# - attr(*, "names")= chr [1:3] "Hello" "bob" "daN"
Run Code Online (Sandbox Code Playgroud)
为什么sapply()返回一个以旧值作为属性的向量?我不想要它们,我不需要它们,并且当应用于例如数值向量时我不知道这种行为。
我有一个数据框,其中列参数的值是 Json 数据:
# Parameters
#1 {"a":0,"b":[10.2,11.5,22.1]}
#2 {"a":3,"b":[4.0,6.2,-3.3]}
...
Run Code Online (Sandbox Code Playgroud)
我想提取每行的参数并将它们作为A、B1、B2和B3列附加到数据框中。
我该怎么做?
如果可能且高效的话,我宁愿使用dplyr 。
有人可以解释一下如何操作apply()和sapply()操作数据框列之间的区别吗?
例如,在尝试查找数据框中每一列的类时,我的第一个倾向是apply在列上使用:
> apply(iris, 2, class)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
"character" "character" "character" "character" "character"
Run Code Online (Sandbox Code Playgroud)
然而,这是不正确的,因为一些列是数字:
> class(iris$Petal.Length)
[1] "numeric"
Run Code Online (Sandbox Code Playgroud)
在 Google 上进行快速搜索,找到了该问题的解决方案,该解决方案使用sapply而不是apply:
> sapply(iris, class)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
"numeric" "numeric" "numeric" "numeric" "factor"
Run Code Online (Sandbox Code Playgroud)
在这种情况下,sapply隐式转换iris为列表,然后将函数应用于列表中的每个条目,例如:
> class(as.list(iris)$Petal.Length)
[1] "numeric"
Run Code Online (Sandbox Code Playgroud)
我仍然不清楚的是为什么我最初的尝试apply没有奏效。
我有一个计算时间太长的脚本,我正在尝试并行化其执行。
该脚本基本上循环遍历数据帧的每一行并执行一些计算,如下所示:
my.df = data.frame(id=1:9,value=11:19)
sumPrevious <- function(df,df.id){
sum(df[df$id<=df.id,"value"])
}
for(i in 1:nrow(my.df)){
print(sumPrevious(my.df,my.df[i,"id"]))
}
Run Code Online (Sandbox Code Playgroud)
我开始学习在 R 中并行化代码,这就是为什么我首先想了解如何使用类似 apply 的函数(例如 sapply、lapply、mapply)来做到这一点。
我尝试了多种方法,但到目前为止没有任何效果:
mapply(sumPrevious,my.df,my.df$id) # Error in df$id : $ operator is invalid for atomic vectors
Run Code Online (Sandbox Code Playgroud) 我想将数据帧的所有列转换为数字格式。所以我使用 lapply
data.frame(lapply(dat, numeric))
Run Code Online (Sandbox Code Playgroud)
但这向我展示了一个无效的长度参数错误。但是,当我尝试使用单个色谱柱时它正在工作。
lapply(dat$x.Type, numeric)
Run Code Online (Sandbox Code Playgroud)
但话又说回来,我又想知道如何用这个更新原始数据框。
我猜我的问题的解决方案是运行一个循环,应用 lapply 穿过所有 coloumns 。问题是我无法弄清楚如何做到这一点。
有人可以帮助我吗?
我目前正在尝试在进行任何转换和计算之前比较 R 中各种数据框的列类和名称。我的代码如下所示:
library(dplyr)
m1 <- mtcars
m2 <- mtcars %>% mutate(cyl = factor(cyl), xxxx1 = factor(cyl))
m3 <- mtcars %>% mutate(cyl = factor(cyl), xxxx2 = factor(cyl))
out <- cbind(sapply(m1, class), sapply(m2, class), sapply(m3, class))
Run Code Online (Sandbox Code Playgroud)
如果有人可以为存储在列表中的数据帧解决这个问题,那就太好了。我所有的数据帧目前都存储在一个列表中,以便于处理。
All.list <- list(m1,m2,m3)
Run Code Online (Sandbox Code Playgroud)
我期望输出以矩阵形式显示,如数据框“out”中所示。“out”中的输出是不可取的,因为它是不正确的。我希望输出更多如下:
我想计算每个省的房屋数量之间的平均地理距离。
假设我有以下数据。
df1 <- data.frame(province = c(1, 1, 1, 2, 2, 2),
house = c(1, 2, 3, 4, 5, 6),
lat = c(-76.6, -76.5, -76.4, -75.4, -80.9, -85.7),
lon = c(39.2, 39.1, 39.3, 60.8, 53.3, 40.2))
Run Code Online (Sandbox Code Playgroud)
使用geosphere图书馆,我可以找到两所房子之间的距离。例如:
library(geosphere)
distm(c(df1$lon[1], df1$lat[1]), c(df1$lon[2], df1$lat[2]), fun = distHaversine)
#11429.1
Run Code Online (Sandbox Code Playgroud)
如何计算该省所有房屋之间的距离并收集每个省的平均距离?
原始数据集每个省都有数百万个观测值,因此此处的性能也是一个问题。
我目前正在学习 R。特别是我需要记住 -function 系列中的函数apply(例如lapply、sapply、mapply等)。我知道apply-function 系列中的每个函数的作用(特别是这个答案很有帮助),但有时会混淆名称。
每个 apply 函数的前缀是否有自然含义(例如lapply = 'list'-apply)?
好的,我必须重新编码 df,因为我希望因子为整数:
library(dplyr)
load(url('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/crash2.rda'))
df <- crash2 %>% select(source, sex)
df$source <- sapply(df$source, switch, "telephone" = 1, "telephone entered manually" = 2, "electronic CRF by email" = 3, "paper CRF enteredd in electronic CRF" = 4, "electronic CRF" = 5, NA)
Run Code Online (Sandbox Code Playgroud)
这按预期工作,但下一个变量(性别)中有 NA 并且事情变得复杂:
df$sex <- sapply(df$sex, switch, "male" = 1, "female" = 2, NA)
Run Code Online (Sandbox Code Playgroud)
返回一个 NA 切换到遗忘的列表。使用unlist()返回一个对于 df 来说太短的向量。
length(unlist(sapply(df$sex, switch, "male" = 1, "female" = 2, NA)))
Run Code Online (Sandbox Code Playgroud)
应该是20207,但是是20206。
我想要的是通过将 NA 作为 NA …
Jim Hester 的“lintr”包包含许多不同的 R linter。该包的README以这种方式描述了其中一个linter :
undesirable_function_linter:报告不受欢迎的功能的使用,例如选项或 sapply 并提出替代方案。
我很惊讶。我一直在使用的R用很多年了,我一直在使用options(),并sapply()多年。是什么让他们不受欢迎?还有更好的选择吗?
我知道getOption(),但它不能代替options()。我还了解*apply()变体Map()、 和 Tidyversemap函数。总体而言,Tidyverse 函数对我来说似乎比sapply()or Map()- 我更喜欢 Tidyverse 函数中的默认值和参数顺序 - 但我不会想到称之为sapply()“不受欢迎”。