我在R中有以下形式的数据帧:
> head(data)
Group Score Info
1 1 1 a
2 1 2 b
3 1 3 c
4 2 4 d
5 2 3 e
6 2 1 f
Run Code Online (Sandbox Code Playgroud)
我想在Score使用该max函数的列之后聚合它
> aggregate(data$Score, list(data$Group), max)
Group.1 x
1 1 3
2 2 4
Run Code Online (Sandbox Code Playgroud)
但我还想显示与每个组Info的Score列的最大值相关联的列.我不知道该怎么做.我想要的输出是:
Group.1 x y
1 1 3 c
2 2 4 d
Run Code Online (Sandbox Code Playgroud)
任何提示?
这确实挑战了我调试R代码的能力.
我想ddply()用于将相同的函数应用于按顺序命名的不同列; 例如.a,b,c.为此,我打算重复将列名称作为字符串传递,并使用eval(parse(text=ColName))该函数来引用它.我从另一个答案中抓住了这个技术.
这很有效,直到我放入ddply()另一个功能.以下是示例代码:
# Required packages:
library(plyr)
myFunction <- function(x, y){
NewColName = "a"
z = ddply(x, y, summarize,
Ave = mean(eval(parse(text=NewColName)), na.rm=TRUE)
)
return(z)
}
a = c(1,2,3,4)
b = c(0,0,1,1)
c = c(5,6,7,8)
df = data.frame(a,b,c)
sv = c("b")
#This works.
ColName = "a"
ddply(df, sv, summarize,
Ave = mean(eval(parse(text=ColName)), na.rm=TRUE)
)
#This doesn't work
#Produces error: "Error in parse(text = NewColName) : object 'NewColName' not found"
myFunction(df,sv)
#Output in both …Run Code Online (Sandbox Code Playgroud) 我有一个命名值列表:
myList <- list('A'=1, 'B'=2, 'C'=3)
Run Code Online (Sandbox Code Playgroud)
我想要一个具有该值的向量 1:3
我无法弄清楚如何在不定义函数的情况下提取值.有一种我不知道的简单方法吗?
library(plyr)
myvector <- laply(myList, function(x) x)
Run Code Online (Sandbox Code Playgroud)
是否有类似于myList$Values剥离名称并将其作为向量返回的东西?
我有一个如下所示的数据框:
#df
ID DRUG FED AUC0t Tmax Cmax
1 1 0 100 5 20
2 1 1 200 6 25
3 0 1 NA 2 30
4 0 0 150 6 65
Run Code Online (Sandbox Code Playgroud)
答案等等.我想总结药物DRUG和FED状态的AUC,Tmax和Cmax的一些统计数据FED.我用dplyr.例如:对于AUC:
CI90lo <- function(x) quantile(x, probs=0.05, na.rm=TRUE)
CI90hi <- function(x) quantile(x, probs=0.95, na.rm=TRUE)
summary <- df %>%
group_by(DRUG,FED) %>%
summarize(mean=mean(AUC0t, na.rm=TRUE),
low = CI90lo(AUC0t),
high= CI90hi(AUC0t),
min=min(AUC0t, na.rm=TRUE),
max=max(AUC0t,na.rm=TRUE),
sd= sd(AUC0t, na.rm=TRUE))
Run Code Online (Sandbox Code Playgroud)
但是,输出不按DRUG和FED分组.它只给出一行包含DRUG和FED中未分面的统计数据.
知道为什么吗?我怎样才能让它做正确的事情?
我正在通过黑客机器学习,我被困在这一行:
from.weight <- ddply(priority.train, .(From.EMail), summarise, Freq = length(Subject))
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误:
Error in attributes(out) <- attributes(col) :
'names' attribute [9] must be the same length as the vector [1]
Run Code Online (Sandbox Code Playgroud)
这是一个追溯():
> traceback()
11: FUN(1:5[[1L]], ...)
10: lapply(seq_len(n), extract_col_rows, df = x, i = i)
9: extract_rows(x$data, x$index[[i]])
8: `[[.indexed_df`(pieces, i)
7: pieces[[i]]
6: function (i)
{
piece <- pieces[[i]]
if (.inform) {
res <- try(.fun(piece, ...))
if (inherits(res, "try-error")) {
piece <- paste(capture.output(print(piece)), collapse = "\n")
stop("with piece ", i, ": …Run Code Online (Sandbox Code Playgroud) 我有一个模拟,有一个巨大的聚合,并在中间组合步骤.我使用plyr的ddply()函数对这个过程进行了原型设计,这对我的大部分需求非常有用.但是我需要这个聚合步骤更快,因为我必须运行10K模拟.我已经在并行缩放模拟,但如果这一步更快,我可以大大减少我需要的节点数量.
这是对我要做的事情的合理简化:
library(Hmisc)
# Set up some example data
year <- sample(1970:2008, 1e6, rep=T)
state <- sample(1:50, 1e6, rep=T)
group1 <- sample(1:6, 1e6, rep=T)
group2 <- sample(1:3, 1e6, rep=T)
myFact <- rnorm(100, 15, 1e6)
weights <- rnorm(1e6)
myDF <- data.frame(year, state, group1, group2, myFact, weights)
# this is the step I want to make faster
system.time(aggregateDF <- ddply(myDF, c("year", "state", "group1", "group2"),
function(df) wtd.mean(df$myFact, weights=df$weights)
)
)
Run Code Online (Sandbox Code Playgroud)
所有提示或建议表示赞赏!
当我想要携带多个度量变量时,我无法找出将数据从长格式转换为宽格式的最优雅和灵活的方法.
例如,这是一个长格式的简单数据框. ID是主体,TIME是时间可变的,并且X和Y是由测量X在Y:
> my.df <- data.frame(ID=rep(c("A","B","C"), 5), TIME=rep(1:5, each=3), X=1:15, Y=16:30)
> my.df
ID TIME X Y
1 A 1 1 16
2 B 1 2 17
3 C 1 3 18
4 A 2 4 19
5 B 2 5 20
6 C 2 6 21
7 A 3 7 22
8 B 3 8 23
9 C 3 9 24
10 A 4 10 25
11 B 4 11 26 …Run Code Online (Sandbox Code Playgroud) 我喜欢plyr语法.任何时候我必须使用*apply()命令之一,我最终踢狗并进行为期3天的弯曲.因此,为了我的狗和我的肝脏,在数据帧的每一行上执行ddply操作的简洁语法是什么?
这是一个适用于简单案例的例子:
x <- rnorm(10)
y <- rnorm(10)
df <- data.frame(x,y)
ddply(df,names(df) ,function(df) max(df$x,df$y))
Run Code Online (Sandbox Code Playgroud)
这很好,给了我想要的东西.但是如果事情变得更复杂,这会导致plyr变得时髦(并且不像Bootsy Collins)因为plyr正在咀嚼从所有那些浮点数值中取出"等级"
x <- rnorm(1000)
y <- rnorm(1000)
z <- rnorm(1000)
myLetters <- sample(letters, 1000, replace=T)
df <- data.frame(x,y, z, myLetters)
ddply(df,names(df) ,function(df) max(df$x,df$y))
Run Code Online (Sandbox Code Playgroud)
在我的盒子上咀嚼几分钟,然后返回:
Error: memory exhausted (limit reached?)
In addition: Warning messages:
1: In paste(rep(l, each = ll), rep(lvs, length(l)), sep = sep) :
Reached total allocation of 1535Mb: see help(memory.size)
2: In paste(rep(l, each = ll), rep(lvs, length(l)), sep = sep) :
Reached …Run Code Online (Sandbox Code Playgroud) 我的数据集中有一列,其中时间段(Time)是从ab开始的整数.有时,任何特定组都可能缺少时间段.我想用这些行填写NA.以下是1(几千个)组的示例数据.
structure(list(Id = c(1, 1, 1, 1), Time = c(1, 2, 4, 5), Value = c(0.568780482159894,
-0.7207749516298, 1.24258192959273, 0.682123081696789)), .Names = c("Id",
"Time", "Value"), row.names = c(NA, 4L), class = "data.frame")
Id Time Value
1 1 1 0.5687805
2 1 2 -0.7207750
3 1 4 1.2425819
4 1 5 0.6821231
Run Code Online (Sandbox Code Playgroud)
如您所见,时间3缺失.通常一个或多个可能会丢失.我可以自己解决这个问题,但恐怕我不会以最有效的方式做到这一点.我的方法是创建一个函数:
生成时间段从序min(Time)到max(Time)
然后做一个setdiff抓取缺失的Time值.
将该向量转换为a data.frame
拉出唯一标识符变量(Id以及上面未列出的其他变量),并将其添加到此data.frame中.
合并两者.
从功能返回.
因此整个过程将按如下方式执行:
# Split the data into individual data.frames by …Run Code Online (Sandbox Code Playgroud) 我想在一列中对具有相同值的行求和:
> df <- data.frame("1"=c("a","b","a","c","c"), "2"=c(1,5,3,6,2), "3"=c(3,3,4,5,2))
> df
X1 X2 X3
1 a 1 3
2 b 5 3
3 a 3 4
4 c 6 5
5 c 2 2
Run Code Online (Sandbox Code Playgroud)
对于一列(X2),可以聚合数据以获得具有相同X1值的所有行的总和:
> ddply(df, .(X1), summarise, X2=sum(X2))
X1 X2
1 a 4
2 b 5
3 c 8
Run Code Online (Sandbox Code Playgroud)
如何为X3和除X1之外的任意数量的其他列执行相同的操作?
这是我想要的结果:
X1 X2 X3
1 a 4 7
2 b 5 3
3 c 8 7
Run Code Online (Sandbox Code Playgroud)