标签: sapply

为什么 sapply() 在字符上使用时会返回一个包含属性的列表?

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()返回一个以旧值作为属性的向量?我不想要它们,我不需要它们,并且当应用于例如数值向量时我不知道这种行为。

r sapply

4
推荐指数
1
解决办法
1931
查看次数

从 R 数据帧的行中提取 JSON 数据

我有一个数据框,其中列参数的值是 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)

我想提取每行的参数并将它们作为AB1B2B3列附加到数据框中。

我该怎么做?

如果可能且高效的话,我宁愿使用dplyr 。

json r sapply dplyr

4
推荐指数
1
解决办法
4987
查看次数

数据框列的 apply 和 sapply 之间的区别?

有人可以解释一下如何操作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没有奏效。

r apply dataframe sapply

4
推荐指数
1
解决办法
2887
查看次数

使用 R 中的 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)

parallel-processing r lapply sapply mapply

4
推荐指数
1
解决办法
2244
查看次数

长度参数无效

我想将数据帧的所有列转换为数字格式。所以我使用 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 dataframe sapply data-science

4
推荐指数
1
解决办法
1万
查看次数

比较 R 中各种数据框的列名

我目前正在尝试在进行任何转换和计算之前比较 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”中的输出是不可取的,因为它是不正确的。我希望输出更多如下:

在此处输入图片说明

r class lapply dataframe sapply

4
推荐指数
2
解决办法
2508
查看次数

按组的地理距离-在每对行上应用函数

我想计算每个省的房屋数量之间的平均地理距离。

假设我有以下数据。

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 vectorization geospatial dataframe sapply

4
推荐指数
2
解决办法
395
查看次数

R 中应用函数族的命名/名称

我目前正在学习 R。特别是我需要记住 -function 系列中的函数apply(例如lapplysapplymapply等)。我知道apply-function 系列中的每个函数的作用(特别是这个答案很有帮助),但有时会混淆名称。

每个 apply 函数的前缀是否有自然含义(例如lapply = 'list'-apply)?

r apply lapply sapply mapply

4
推荐指数
1
解决办法
197
查看次数

如何让 switch() 处理 NA?

好的,我必须重新编码 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 …

r sapply

4
推荐指数
1
解决办法
160
查看次数

为什么 sapply() 和 options() “不受欢迎”?

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()“不受欢迎”。

r options sapply lintr

4
推荐指数
1
解决办法
86
查看次数