标签: sapply

忽略NA的功能

我正在使用R并且已经四处寻找答案但是虽然我看到了类似的问题,但它对我的具体问题没有用.

在我的数据集中,我试图使用NA's作为占位符,因为一旦我完成了部分分析,我将返回它们,因此,我希望能够做我所有的计算,好像它们NA不是真的在那里.

这是我的示例数据表的问题

ROCA = c(1,3,6,2,1,NA,2,NA,1,NA,4,NA)
ROCA <- data.frame (ROCA=ROCA)       # converting it just because that is the format of my original data

#Now my function
exceedes <- function (L=NULL, R=NULL, na.rm = T)
 {
    if (is.null(L) | is.null(R)) {
        print ("mycols: invalid L,R.")
        return (NULL)               
    }
    test <-(mean(L, na.rm=TRUE)-R*sd(L,na.rm=TRUE))
  test1 <- sapply(L,function(x) if((x)> test){1} else {0})
  return (test1)
}
L=ROCA[,1]
R=.5
ROCA$newcolumn <- exceedes(L,R)
names(ROCA)[names(ROCA)=="newcolumn"]="Exceedes1"
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Error in if ((x) > test) { : missing …
Run Code Online (Sandbox Code Playgroud)

r function sapply

5
推荐指数
2
解决办法
5958
查看次数

比较相同向量的相邻元素(避免循环)

我设法写了一个for loop比较以下向量中的字母:

bases <- c("G","C","A","T")
test <- sample(bases, replace=T, 20)
Run Code Online (Sandbox Code Playgroud)

test 将返回

[1] "T" "G" "T" "G" "C" "A" "A" "G" "A" "C" "A" "T" "T" "T" "T" "C" "A" "G" "G" "C"
Run Code Online (Sandbox Code Playgroud)

通过该功能,Comp()我可以检查字母是否与下一个字母匹配

Comp <- function(data)
{
    output <- vector()
    for(i in 1:(length(data)-1))
    {
    if(data[i]==data[i+1])
        {
        output[i] <-1
        }
        else
        {
        output[i] <-0
        }
    }
    return(output)
}
Run Code Online (Sandbox Code Playgroud)

导致;

> Comp(test)
 [1] 0 0 0 0 0 1 0 0 0 0 0 1 1 1 …
Run Code Online (Sandbox Code Playgroud)

r vector string-comparison sapply

5
推荐指数
1
解决办法
4740
查看次数

使用R中的一个数据评估许多函数

我知道我可以使用apply评估一个包含许多数据的函数,但是我可以使用一个数据评估许多函数吗?使用sapply我可以得到:

sapply(list(1:5,10:20,5:18), sum)
Run Code Online (Sandbox Code Playgroud)

但我想要像这样的东西:

sapply(1:5, list(sum, min,max))
Run Code Online (Sandbox Code Playgroud)

得到

15 1 5
Run Code Online (Sandbox Code Playgroud)

有什么聪明的主意吗?:)

r function apply evaluate sapply

5
推荐指数
1
解决办法
167
查看次数

从sapply/lapply返回多个值

我是R的新手并试图用apply系列中的fuction替换一些for循环.我仍然完全不了解它们是如何工作的,但我设法生成了一段代码:

#create some input data
tech<-data.frame(cbind(c("p1","p2","p3","p4"),c(15,15,15,100),c(10,8,18,100)))
colnames(tech)=c("id","capacity.el","capacity.th")
tech$capacity.el<-as.numeric(tech$capacity.el)
tech$capacity.th<-as.numeric(tech$capacity.th)

heat<-data.frame(cbind(c(2,12,6,20,32,21,25,16,34,0),c(31,18,3,27,30,31,18,4,24,7),c(2,12,6,20,32,21,25,16,34,0),c(31,18,3,27,30,31,18,4,24,7)))
colnames(heat)=c("p1","p2","p3","p4")

> tech
  id capacity.el capacity.th
1 p1           2           1
2 p2           2           4
3 p3           2           3
4 p4           1           2


> heat
   p1 p2 p3 p4
1   2 31  2 31
2  12 18 12 18
3   6  3  6  3
4  20 27 20 27
5  32 30 32 30
6  21 31 21 31
7  25 18 25 18
8  16  4 16  4
9  34 …
Run Code Online (Sandbox Code Playgroud)

r lapply sapply

5
推荐指数
1
解决办法
2635
查看次数

以lapply/sapply访问前面的元素

我试图for用一个sapply函数替换一个循环.在循环内部我做了一些优化,因此需要为下一个循环进行一次优化的结果.

我想出了如何使用它sapply来运行优化,但问题是我需要从内部访问以前的结果sapply.

以下只是我试图实现的一个随机例子.

sapply(1:4, function(y){
  r<-y
  if(y!=1){z<-r[y-1]}
  else{z<-9}
  return(z)
  })

[1,]    9    2   NA   NA
Run Code Online (Sandbox Code Playgroud)

我期望得到的是:

[1,]    9    1    2   3
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?或者有没有办法访问以前的迭代结果sapply

r lapply sapply

5
推荐指数
2
解决办法
1604
查看次数

R:如何在 lapply() 中应用 grep()

我想在 R 中应用 grep(),但我不太擅长 lapply()。我知道 lapply 能够获取一个列表,将函数应用于每个成员并输出一个列表。例如,假设x一个列表由 2 个成员组成。

> x<-strsplit(docs$Text," ")
> 
> x
[[1]]
 [1] "I"         "lovehttp"  "my"        "mum."      "I"         "love"     
 [7] "my"        "dad."      "I"         "love"      "my"        "brothers."

[[2]]
 [1] "I"         "live"      "in"        "Eastcoast" "now."      "Job.I"    
 [7] "used"      "to"        "live"      "in"        "WestCoast."  
Run Code Online (Sandbox Code Playgroud)

我想应用 grep() 函数来删除由 http 组成的单词。所以,我会申请:

> lapply(x,grep(pattern="http",invert=TRUE, value=TRUE))
Run Code Online (Sandbox Code Playgroud)

但它不起作用,它说

Error in grep(pattern = "http", invert = TRUE, value = TRUE) : 
argument "x" is missing, with no default
Run Code Online (Sandbox Code Playgroud)

所以,我试过了

> lapply(x,grep(pattern="http",invert=TRUE, value=TRUE,x))
Run Code Online (Sandbox Code Playgroud)

但它说

Error …
Run Code Online (Sandbox Code Playgroud)

r lapply sapply tapply

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

R dplyr:在列中查找特定值,然后使用该值替换右侧后续列中的相邻单元格

我正在尝试创建一个站点和事件时间矩阵.在我的情况下,一旦事件发生("1"),它是永久性的,不能回到"0".一旦列中的单元格为"1",我将尝试使用"1"填充右侧后续列中的相邻单元格(请参阅下面的示例).

site <- c('A','B','C','D','E','F','G') #site
time <- c(0,1,4,0,3,2,0) # time in which even occured
event <- c(0,1,1,0,1,1,0) # did a event occur
data <- data.frame(site, time, event)

site.time.matrix <- cast(data, site~time)

# This is the output      # This is the desired output
#site   0  1  2  3  4     #site   0  1  2  3  4
#    A  0 NA NA NA NA     #    A  0  0  0  0  0
#    B NA  1 NA NA NA     #    B  0  1  1 …
Run Code Online (Sandbox Code Playgroud)

r apply lapply sapply dplyr

5
推荐指数
1
解决办法
438
查看次数

表示多个组的多个列

我正在尝试为具有多个组的数据框的多列找到不包括 NA 的方法

airquality <- data.frame(City = c("CityA", "CityA","CityA",
                                  "CityB","CityB","CityB",
                                  "CityC", "CityC"),
                         year = c("1990", "2000", "2010", "1990", 
                                  "2000", "2010", "2000", "2010"),
                         month = c("June", "July", "August",
                                   "June", "July", "August",
                                   "June", "August"),
                         PM10 = c(runif(3), rnorm(5)),
                         PM25 = c(runif(3), rnorm(5)),
                         Ozone = c(runif(3), rnorm(5)),
                         CO2 = c(runif(3), rnorm(5)))
airquality
Run Code Online (Sandbox Code Playgroud)

所以我得到一个带有数字的名称列表,所以我知道要选择哪些列:

nam<-names(airquality)
namelist <- data.frame(matrix(t(nam)));namelist
Run Code Online (Sandbox Code Playgroud)

我想按城市和年份计算 PM25、臭氧和二氧化碳的平均值。这意味着我需要第 1,2,4,6:7 列)

acast(datadf, year ~ city, mean, na.rm=TRUE)
Run Code Online (Sandbox Code Playgroud)

但这并不是我真正想要的,因为它包含了我不需要的东西的平均值,而且它不是数据帧格式。我可以转换它然后删除,但这似乎是一种非常低效的方法。

有没有更好的办法?

r sapply dplyr dcast

5
推荐指数
1
解决办法
8272
查看次数

sapply - 保留列名

我试图总结数据集中许多不同列(变量)的均值、标准差等。我编写了自己的汇总函数以准确返回我需要的内容,并使用 sapply 一次将此函数应用于所有变量。它工作正常,但是返回的数据框没有列名,我似乎甚至无法使用列号引用重命名它们 - 也就是它们似乎无法以任何方式使用。

我的代码如下 - 因为我只是在查找汇总统计信息,所以我只想使用相同的列(变量)名称,有 4 行(平均值、标准差、最小值、最大值)。有什么办法可以做到这一点(即使是我手动更改列名称的缓慢方法)

 #GENERATING DESCRIPTIVE STATISTICS
sfsum= function(x){
  mean=mean(x)
  sd=sd(x)
  min=min(x)
  max=max(x)

  return(c(mean,sd,min,max))
}

#
c= list(sfbalanced$age_child, sfbalanced$earnings_child, 
sfbalanced$logchildinc ,sfbalanced$p_inc84, sfbalanced$login84, 
sfbalanced$p_inc85, sfbalanced$login85, sfbalanced$p_inc86, 
sfbalanced$login86, sfbalanced$p_inc87, sfbalanced$login87, 
sfbalanced$p_inc88, sfbalanced$login88)

summ=sapply(c,sfsum)

names(summ)
 NULL
Run Code Online (Sandbox Code Playgroud)

r columnname sapply

5
推荐指数
2
解决办法
4043
查看次数

R - 在列中查找模式并替换它(更有效的解决方案)

我有一个大型的乘客数据集,类似于以下内容:

routes <- c("MEX-GDL", "ACA-MEX", "CUN-MTY", "MTY-CUN", "GDL-MEX", "MEX-ACA")
pax <- sample(100:500, size = 6, replace = T)
traffic <- data.frame(routes = routes, pax = pax)

   routes pax
   1 MEX-GDL 282
   2 ACA-MEX 428
   3 CUN-MTY 350
   4 MTY-CUN 412
   5 GDL-MEX 474
   6 MEX-ACA 263
Run Code Online (Sandbox Code Playgroud)

如果原点和目的地匹配以获得路线中的乘客总数,我想分组航班 - 例如将路线重命名MEX-GDLGDL-MEX或反之亦然,以便我可以group_by()在数据集上使用.

有点像这样:

traffic %>% group_by(routes) %>% summarise(sum(pax)) 
Run Code Online (Sandbox Code Playgroud)

我已经完成了以下工作,但是我认为可以有更有效的方法来解决问题(因为运行需要相当长的时间):

library(tidyverse)

traffic$routes <- as.character(traffic$routes)

for(route in traffic$routes){
  a <- substring(route, first = 1, last = 3) 
  b <- …
Run Code Online (Sandbox Code Playgroud)

substring r sapply

5
推荐指数
1
解决办法
61
查看次数