我正在使用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) 我设法写了一个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) 我知道我可以使用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的新手并试图用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) 我试图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 中应用 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) 我正在尝试创建一个站点和事件时间矩阵.在我的情况下,一旦事件发生("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) 我正在尝试为具有多个组的数据框的多列找到不包括 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)
但这并不是我真正想要的,因为它包含了我不需要的东西的平均值,而且它不是数据帧格式。我可以转换它然后删除,但这似乎是一种非常低效的方法。
有没有更好的办法?
我试图总结数据集中许多不同列(变量)的均值、标准差等。我编写了自己的汇总函数以准确返回我需要的内容,并使用 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) 我有一个大型的乘客数据集,类似于以下内容:
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-GDL为GDL-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)