如果我有两个变量X和Y的一系列观察,我怎样才能根据变量X的范围得到Y的平均值?
例如,有些数据如下:
df = data.frame(x=runif(50,1,100),y=runif(50,300,700))
我怎么能得到答案"当X为1-10时,平均值为332.4,当X为11-20时,y的平均值为632.3,等等......"
我通常使用大型数据帧,这些数据帧排序很好(或者可以很容易地排序).
给定两个数据帧,两者都按'用户'排序
some.data <user> <data_1> <data_2>
user <user> <user_attr_1> <user_attr_2>
Run Code Online (Sandbox Code Playgroud)
我跑m = merge(some.data,user),我得到的结果如下:
m = <user> <data_1> <data_2> <user_attr_1> <user_attr_2>
Run Code Online (Sandbox Code Playgroud)
这很好.
但是merge没有利用这些数据帧在公共列上排序,使得合并相当漂亮的CPU /内存很重.但是,这个合并可以在O(n)中完成
我想知道在R中是否有办法对排序数据集进行有效合并?
我有一段代码,总耗时约为30秒,下面的代码大约是27秒.我将违规代码缩小到这个:
d$dis300[i] <- h
Run Code Online (Sandbox Code Playgroud)
所以我换到另一件,现在工作得非常快(正如预期的那样).
我的问题是为什么这对第二个太慢了.数据DF约为7500x18变量
第一:( 27秒过去了)
d$dis300 <- 0
for (i in 1:netot) {
h <- aaa[d$ent[i], d$dis[i]]
if (h == 0) writeLines(sprintf("ERROR. ent:%i dis:%i", d$ent[i], d$dis[i]))
d$dis300[i] <- h
}
Run Code Online (Sandbox Code Playgroud)
第二:(0.2秒过去了)
d$dis300 <- 0
for (i in 1:netot) {
h <- aaa[d$ent[i], d$dis[i]]
if (h == 0) writeLines(sprintf("ERROR. ent:%i dis:%i", d$ent[i], d$dis[i]))
foo[i] <- h
}
d$foo <- foo
Run Code Online (Sandbox Code Playgroud)
你可以看到两者都是"相同的",但有一个人有这个DF而不是一个向量.
任何评论都非常感谢.我来自另一种语言,这让我疯了一会儿.至少我有解决方案,但我希望将来能够防止这类问题.
谢谢你的时间,
我已经搜索了SO,虽然有很多关于有条件删除行的QA但没有QA适合我的问题.
我有一个data.frame可变的含纵向测量x,y...,在各个时间点等time,在若干受试者id.一些受试者经历事件ev(表示为1,否则0在某些情况下time).我想将初始值减少data.frame到:
以便,
testdf<-data.frame(id=c(rep("A",4),rep("B",4),rep("C",4) ),
x=c(NA, NA, 1,2, 3, NA, NA, 1, 2, NA,NA, 5),
y=rev(c(NA, NA, 1,2, 3, NA, NA, 1, 2, NA,NA, 5)),
time=c(1,2,3,4,0.1,0.5,10,20,3,2,1,0.5),
ev=c(0,0,0,0,0,1,0,0,0,0,0,1))
Run Code Online (Sandbox Code Playgroud)
会减少到
id x y time ev
1 A NA 5 1.0 0
2 A NA NA 2.0 0
3 A 1 NA 3.0 0
4 A 2 2 4.0 0
5 …Run Code Online (Sandbox Code Playgroud) 继承我的数据,
> data
Manufacturers Models
1 audi RS5
2 bmw M3
3 cadillac CTS-V
4 lexus ISF
Run Code Online (Sandbox Code Playgroud)
我想要在第一列的第一个字母大写,如下所示:
> data
Manufacturers Models
1 Audi RS5
2 Bmw M3
3 Cadillac CTS-V
4 Lexus ISF
Run Code Online (Sandbox Code Playgroud)
我很感激这个问题的任何帮助.非常感谢.
有问题.我需要将一个不规则的列表列表转换为宽格式的data.frame(即我需要相同数量的行),我只是无法弄清楚如何做到这一点.列表看起来像这样:
[[1]]
[1] 14
[[2]]
[1] 26
[[3]]
[1] 20 21 22 23
[[4]]
[1] 21 22
[[5]]
[1] 25
[[6]]
[1] 17 21 23
Run Code Online (Sandbox Code Playgroud)
我尝试过使用for循环和/或sapply的各种方法,但没有任何作用.不同长度的列表元素排除了我所做的任何尝试.在我看来,必须有一种相当直接的方法来做到这一点.一定不是吗?任何人都可以建议吗?
虽然这个细节当然是应用程序特定的,但在SO精神中,我试图尽可能地保持这一点!基本问题是当一个data.frame具有特定日期而另一个具有日期范围时,如何按日期合并data.frames.其次,问题是如何处理给定变量的多个观察,以及如何将它们包含在最终输出data.frame中.我敢肯定其中一些是标准的,但一个非常完整的搜索几乎没有透露.
我正在尝试合并的mre对象如下.
# 'Speeches' data.frame
structure(list(Name = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("BBB",
"AAA"), class = "factor"), Date = structure(c(12543, 12404, 12404,
12404, 12373, 12362, 12345, 12320, 12207, 15450, 15449, 15449,
15449, 15449, 15449, 15449, 15449, 15448, 15448, 15448), class = "Date")), .Names = c("Name",
"Date"), row.names = c("1", "1.1", "1.2", "1.3", "1.4", "1.5",
"1.6", "1.7", "1.8", "2", "2.1", "2.2", "2.3", "2.4", "2.5", …Run Code Online (Sandbox Code Playgroud) 我有两个data.frames,一个有事件数据,另一个有几个公司的股票数据(这里只有两个).我希望在我的事件data.frame中为两家公司增加两个日期滞后(-1天和+1天)的列.滞后日期应该来自我的库存数据.框架(df)当然.我怎样才能做到这一点?
DATE <- c("01.01.2000","02.01.2000","03.01.2000","06.01.2000","07.01.2000","09.01.2000","10.01.2000","01.01.2000","02.01.2000","04.01.2000","06.01.2000","07.01.2000","09.01.2000","10.01.2000")
RET <- c(-2.0,1.1,3,1.4,-0.2, 0.6, 0.1, -0.21, -1.2, 0.9, 0.3, -0.1,0.3,-0.12)
COMP <- c("A","A","A","A","A","A","A","B","B","B","B","B","B","B")
df <- data.frame(DATE, RET, COMP)
df
# DATE RET COMP
# 1 01.01.2000 -2.00 A
# 2 02.01.2000 1.10 A
# 3 03.01.2000 3.00 A
# 4 06.01.2000 1.40 A
# 5 07.01.2000 -0.20 A
# 6 09.01.2000 0.60 A
# 7 10.01.2000 0.10 A
# 8 01.01.2000 -0.21 B
# 9 02.01.2000 -1.20 B
# 10 04.01.2000 0.90 B
# 11 06.01.2000 …Run Code Online (Sandbox Code Playgroud) 我将以下文件读入data.table,如下所示:
raw <- fread("avito_train.tsv", nrows=1000)
Run Code Online (Sandbox Code Playgroud)
然后,如果我改变特定列和行的编码,如下所示:
Encoding(raw$title[2]) <- "UTF-8"
Run Code Online (Sandbox Code Playgroud)
它完美地运作.
但是,如何将编码应用于所有列和所有行?
我检查了fread文档,但似乎没有任何编码选项.此外,我试过,Encoding(raw)但这给了我一个错误(预期的字符向量参数).
编辑:本文详细介绍了有关Windows上RStudio中外来文本的更多信息http://quantifyingmemory.blogspot.com/2013/01/r-and-foreign-characters.html
干杯,我有两个数据框,具有以下结构.
DF1:
Airlines HeadQ Date Cost_Index
American PHX 07-31-2016 220
American ATL 08-31-2016 150
American ATL 10-31-2016 150
Delta ATL 10-31-2016 180
American ATL 08-31-2017 200
Run Code Online (Sandbox Code Playgroud)
第二数据帧DF2具有以下结构:
DF2:
Airlines HeadQ Date
American ATL 09-30-2016
Delta ATL 03-31-2017
Run Code Online (Sandbox Code Playgroud)
现在查看数据帧DF1和DF2,我想将DF1改为以下数据帧.
DF1:
Airlines HeadQ Date Cost_Index
American PHX 07-31-2016 220
American ATL 08-31-2016 0
American ATL 10-31-2016 150
Delta ATL 10-31-2016 180
American ATL 08-31-2017 200
Run Code Online (Sandbox Code Playgroud)
条件是,从DF2查找DF1的航空公司和HeadQ,如果DF1 $ Date <DF2 $ Date,则将Cost_Index设为0,否则继续使用Cost_Index.
我尝试了,但未成功,:
DF1$Cost_Index <- ifelse(DF1$Airlines == DF2$Airlines & DF1$HeadQ == DF2$HeadQ
& …Run Code Online (Sandbox Code Playgroud) r ×10
dataframe ×8
merge ×3
data.table ×2
aggregate ×1
conditional ×1
datetime ×1
dplyr ×1
encoding ×1
intervals ×1
lag ×1
list ×1
performance ×1
uppercase ×1