我有一个数据集,其标题如下所示:
PID Time Site Rep Count
Run Code Online (Sandbox Code Playgroud)
我想总结Count
通过Rep
对每个PID x Time x Site combo
对得到的data.frame,我想要得到的平均值Count
进行PID x Time x Site
组合.
目前的功能如下:
dummy <- function (data)
{
A<-aggregate(Count~PID+Time+Site+Rep,data=data,function(x){sum(na.omit(x))})
B<-aggregate(Count~PID+Time+Site,data=A,mean)
return (B)
}
Run Code Online (Sandbox Code Playgroud)
这是非常缓慢的(原始data.frame是510000 20)
.有没有办法加快plyr的速度?
假设我有以下data.frame和以下data.table:
DF = data.frame(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
Run Code Online (Sandbox Code Playgroud)
使用data.frame,我可以根据逻辑向量选择列,如下所示:
DF[,c(TRUE,TRUE,FALSE)]
Run Code Online (Sandbox Code Playgroud)
结果是:
x y
1 a 1
2 a 3
3 a 6
4 b 1
5 b 3
6 b 6
7 c 1
8 c 3
9 c 6
Run Code Online (Sandbox Code Playgroud)
然而
DT[,c(TRUE,TRUE,FALSE)]
Run Code Online (Sandbox Code Playgroud)
导致:
[1] TRUE TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
怎么做到呢?
我有以下数据集
PatientName BVAID Rank TreatmentCode TreatmentID DoseID
Tim Stuart BVA-027 3 OP_TBC 1 1
Tim Stuart BVA-041 4 OP_TBC 1 1
Tim Stuart BVA-021 7 OP_TBC 1 1
Tim Stuart BVA-048 10 OP_TBC 1 1
Tim Stuart BVA-020 14 OP_TBC 1 1
Tim Stuart BVA-024 15 OP_TBC 1 1
Tim Stuart BVA-001 16 OP_TBC 1 1
Tim Stuart BVA-013 27 OP_TBC 1 1
Tim Stuart BVA-018 28 OP_TBC 1 1
Tim Stuart BVA-051 29 OP_TBC 1 1
Tim Stuart BVA-027 …
Run Code Online (Sandbox Code Playgroud) 我有一个数据集,每个参与者都有几个时间评估.我想为每个参与者选择最后一次评估.我的数据集如下所示:
ID week outcome
1 2 14
1 4 28
1 6 42
4 2 14
4 6 46
4 9 64
4 9 71
4 12 85
9 2 14
9 4 28
9 6 51
9 9 66
9 12 84
Run Code Online (Sandbox Code Playgroud)
我想只为每个参与者选择最后一次观察/评估,但我只有周数作为每个参与者的指标.这怎么可能在R(或excel?)
提前致谢,
尼基
我有一个大数据框架需要大约900MB内存.然后我试着像这样修改它:
dataframe[[17]][37544]=0
Run Code Online (Sandbox Code Playgroud)
似乎让R使用超过3G ram而R抱怨"错误:无法分配大小为3.0 Mb的矢量",(我在32位机器上.)
我发现这种方式更好:
dataframe[37544, 17]=0
Run Code Online (Sandbox Code Playgroud)
但R的占地面积仍然翻了一番,命令需要相当长的时间才能运行.
从C/C++背景来看,我对这种行为感到很困惑.我认为dataframe[37544, 17]=0
应该在眨眼间完成,而不花费任何额外的内存(只应修改一个单元格).R对我发布的那些命令做了什么?在不增加内存占用量的情况下,修改数据框中某些元素的正确方法是什么?
非常感谢你的帮助!
陶
这可能是一个愚蠢的问题,但我已经阅读了克劳利关于数据框架的章节并浏览了互联网并且还没有能够做任何事情.
这是一个类似于我的示例数据集:
> data<-data.frame(site=c("A","A","A","A","B","B"), plant=c("buttercup","buttercup",
"buttercup","rose","buttercup","rose"), treatment=c(1,1,2,1,1,1),
plant_numb=c(1,1,2,1,1,2), fruits=c(1,2,1,4,3,2),seeds=c(45,67,32,43,13,25))
> data
site plant treatment plant_numb fruits seeds
1 A buttercup 1 1 1 45
2 A buttercup 1 1 2 67
3 A buttercup 2 2 1 32
4 A rose 1 1 4 43
5 B buttercup 1 1 3 13
6 B rose 1 2 2 25
Run Code Online (Sandbox Code Playgroud)
我想要做的是创建一个场景,只要存在独特的site&plant&treatment&plant_numb组合,就会将"种子"和"水果"相加.理想情况下,这会导致行减少,但保留原始列(即我需要上面的示例看起来像这样:)
site plant treatment plant_numb fruits seeds
1 A buttercup 1 1 3 112
2 A buttercup 2 2 1 32 …
Run Code Online (Sandbox Code Playgroud) 我有一个如下数据框(20,000行乘49列).每行具有唯一的名称(ID),每个ID在3列中具有3个重复读数(例如D15C D15C.1 D15C.2).组合名称的前4个字母("D15C")是组名.我需要按组名称对列进行平均(例如,平均D15C,D15C.1和D15.2得到D15C),因此最终表将合并为49列中的16列.
ID D04C D04C.1 D08H D08H.1 D08H.2 D15C D15C.1 D15C.2 D15L D15L.1 D15L.2
1 1367452_at 11.11 10.93 11.85 10.94 10.87 10.73 10.62 10.85 10.73 10.77 10.52
2 1367453_at 9.65 9.94 9.78 9.68 9.67 9.86 9.71 9.82 9.74 9.71 9.76
3 1367454_at 10.19 10.36 9.68 10.07 10.08 10.35 10.26 10.32 10.27 10.19 10.47
(… 20000 rows)
Run Code Online (Sandbox Code Playgroud)
我将其转置并编辑到以下数据框以便使用聚合:
ID 1367452_at 1367453_at 1367454_at ... ...
1 D04C 11.11 9.65 10.19
2 D04C 10.93 9.94 10.36
3 D08H 11.85 9.78 9.68
4 …
Run Code Online (Sandbox Code Playgroud) 示例数据:
set.seed(1)
df <- data.frame(years=sort(rep(2005:2010, 12)),
months=1:12,
value=c(rnorm(60),NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA))
head(df)
years months value
1 2005 1 -0.6264538
2 2005 2 0.1836433
3 2005 3 -0.8356286
4 2005 4 1.5952808
5 2005 5 0.3295078
6 2005 6 -0.8204684
Run Code Online (Sandbox Code Playgroud)
请告诉我,我怎样才能将df $值中的NA替换为其他月份的中位数?"value"必须包含同月所有先前值的中值.也就是说,如果当前月份是5月,则"值"必须包含5月份所有先前值的中值.
我有一个数据集,重复次数不等.我希望通过删除那些不完整的条目(即复制小于最大值)来对数据进行子集化.只是一个小例子:
set.seed(123)
mydt <- data.frame (name= rep ( c("A", "B", "C", "D", "E"), c(1,2,4,4, 3)),
var1 = rnorm (14, 3,1), var2 = rnorm (14, 4,1))
mydt
name var1 var2
1 A 2.439524 3.444159
2 B 2.769823 5.786913
3 B 4.558708 4.497850
4 C 3.070508 2.033383
5 C 3.129288 4.701356
6 C 4.715065 3.527209
7 C 3.460916 2.932176
8 D 1.734939 3.782025
9 D 2.313147 2.973996
10 D 2.554338 3.271109
11 D 4.224082 3.374961
12 E 3.359814 2.313307
13 E 3.400771 …
Run Code Online (Sandbox Code Playgroud) 我必须阅读大约300个单独的CSV.我已设法使用循环和结构化CSV名称自动化该过程.但是,每个CSV在开始时都有14-17行垃圾,并且随机变化,因此在read.table命令中编写'skip'参数的硬编码将不起作用.每个CSV的列名和列数相同.
这是我反对的一个例子:
QUICK STATISTICS:
Directory: Data,,,,
File: Final_Comp_Zn_1
Selection: SEL{Ox*1000+Doma=1201}
Weight: None,,,
,,Variable: AG,,,
Total Number of Samples: 450212 Number of Selected Samples: 277
Statistics
VARIABLE,Min slice Y(m),Max slice Y(m),Count,Minimum,Maximum,Mean,Std.Dev.,Variance,Total Samples in Domain,Active Samples in Domain AG,
6780.00, 6840.00, 7, 3.0000, 52.5000, 23.4143, 16.8507, 283.9469, 10, 10 AG,
6840.00, 6900.00, 4, 4.0000, 5.5000, 4.9500, 0.5766, 0.3325, 13, 13 AG,
6900.00, 6960.00, 16, 1.0000, 37.0000, 8.7625, 9.0047, 81.0848, 29, 29 AG,
6960.00, 7020.00, 58, 3.0000, 73.5000, 10.6931, 11.9087, 141.8172, 132, 132 …
Run Code Online (Sandbox Code Playgroud) r ×10
data.table ×5
plyr ×3
dataframe ×2
aggregate ×1
csv ×1
mean ×1
read.table ×1
sas ×1
statistics ×1