我试图了解如何在向量上使用优秀的plyr包的命令(在我的情况下,使用字符串).我想我想要使用aaply,但它失败了,要求保证金.但是我的矢量中没有列或行!
更具体一点,以下命令有效,但返回结果列表很奇怪.states.df是一个数据框,region是状态的名称(使用Hadley的map_data("state")命令返回).因此,states.df $ region是字符串的向量(特别是州名).opinion.new是一个数字向量,使用州名命名.
states.df <- map_data("state")
ch = sapply(states.df$region, function (x) { opinion.new[names(opinion.new)==x] } )
Run Code Online (Sandbox Code Playgroud)
我想做的是:
ch = aaply(states.df$region, function (x) { opinion.new[names(opinion.new)==x] } )
Run Code Online (Sandbox Code Playgroud)
其中ch是从opinion.new查找或拉出的数字向量.但aaply需要一个数组,并在向量上失败.
谢谢!
我有一个包含三个分组变量的数据集:condition,sub和delay.这是我的数据的简化版本(实际数据更长)
Run Code Online (Sandbox Code Playgroud)sub condition delay later_value choiceRT later_choice primeRT cue 10 SIZE 10 27 1832 1 888 CHILD 10 PAST 5 11 298 0 1635 PANTS 10 SIZE 21 13 456 0 949 CANDY 11 SIZE 120 22 526 1 7963 BOY 11 FUTURE 120 27 561 1 4389 CHILDREN 11 PAST 5 13 561 1 2586 SPRING
我有一套复杂的程序来应用这些数据(细节并不重要)我编写了以下函数,它可以在分割三个分组变量时完成我想要的功能.它返回我感兴趣的3个变量(indiff,p_intercept,&p_lv)
getIndiffs <- function(currdelay){
if (mean(currdelay$later_choice) == 1) {
indiff = 10.5
p_intercept = "laters"
p_lv = "laters"
}
else if (mean(currdelay$later_choice) == …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过名为的函数进行等效的group by摘要.我有一个数据框,有三列(比方说,和).然后,我想计算每个出现在数据框中的时间(带)并获取每个对应于列的最后一个元素.Rplyrddplyidperiodeventidcount(*)... group by idSQLidevent
这是我拥有的和我想要获得的内容的一个例子:
id period event #original data frame
1 1 1
2 1 0
2 2 1
3 1 1
4 1 1
4 1 0
id t x #what I want to obtain
1 1 1
2 2 1
3 1 1
4 2 0
Run Code Online (Sandbox Code Playgroud)
这是我用过的简单代码:
teachers.pp<-read.table("http://www.ats.ucla.edu/stat/examples/alda/teachers_pp.csv", sep=",", header=T) # whole data frame
datos=ddply(teachers.pp,.(id),function(x) c(t=length(x$id), x=x[length(x$id),3])) #This is working fine.
Run Code Online (Sandbox Code Playgroud)
现在,我一直在阅读用于数据分析的Split-Apply-Combine策略, …
使用R,我想创建一个新列(MaxAct),显示不同列(ActNo)的最大数量,同时按两个因子分组(HHID和PERID)
例如,我有这个数据集:
UID HHID PERID ActNo
1 1000 1 1
2 1000 1 2
3 1000 1 3
4 1000 2 1
5 1000 2 2
6 2000 1 1
7 2000 1 2
8 2000 1 3
9 2000 1 4
10 2000 2 1
11 2000 2 2
Run Code Online (Sandbox Code Playgroud)
然后我想添加新列(MaxAct),如下所示:
UID HHID PERID ActNo MaxAct
1 1000 1 1 3
2 1000 1 2 3
3 1000 1 3 3
4 1000 2 1 2
5 1000 2 2 …Run Code Online (Sandbox Code Playgroud) 我无法弄清楚为什么这不起作用.我有一个包含5列n行的数据集.我只想对每一行应用一个函数,并以n×1向量返回结果.
为了测试一切是如何工作的,我做了这个简单的功能:
f1 <- function(uniqueid,Perspvalue,expvalue,stddevi,stddevc) {
uniqueid+ Perspvalue- expvalue+ stddevi+stddevc
}
Run Code Online (Sandbox Code Playgroud)
这是我的数据集的前几行:
> data
uniqueid Perspvalue expvalue stddevi stddevc
1 1 2.404421e+03 3337239.00 8.266566e+03 3.324624e+03
2 2 1.345307e+03 3276559.87 7.068823e+03 2.648072e+03
3 3 1.345307e+03 3276559.87 7.068823e+03 2.648072e+03
Run Code Online (Sandbox Code Playgroud)
请注意,它是一个数据框(我认为),而不是矩阵.我使用read.csv从csv加载数据.
所以我试试这个: apply(data,1,f1)
但我的结果是这样的: Error in uniqueid + Perspvalue : 'Perspvalue' is missing
我期待一个数字而不是错误.
我使用下面的代码将数据集拆分为两个,并在每一半上执行类似的操作.然后将这两个结果合并在一起.我知道我可能正在描述split-apply-combine框架,但我无法想到如何简化下面的代码.
数据集有4个要更新的变量.4个变量中的每一个都有一个公式来计算新值,每半个公式有不同的公式,共计8个公式.
下面的代码可能会通过某种程度的矢量化来改进吗?它似乎比必要的更冗长.我不确定如何为每个分割半部执行不同的操作(即使用不同的公式),除了下面的方法.
data <- structure(list(site = c(1L, 1L, 1L, 1L, 1L, 1L), plot = 1:6,
C = c(40L, 30L, 10L, 5L, 0L, 0L), E = c(0L, 0L, 0L, 10L,
20L, 45L), M = c(0L, 0L, 0L, 0L, 0L, 10L), P = c(1000L, 900L,
800L, 500L, 200L, 50L), FF = c(1L, 1L, 1L, 0L, 0L, 0L)), .Names = c("site",
"plot", "C", "E", "M", "P", "FF"), class = "data.frame", row.names = c(NA,
-6L))
df1 <- data[data$FF == 1,]
df0 <- data[data$FF …Run Code Online (Sandbox Code Playgroud) 我想计算一段时间内的证券清单的每月收益。我拥有的数据具有以下结构:
date name value
"2014-01-31" a 10.0
"2014-02-28" a 11.1
"2014-03-31" a 12.1
"2014-04-30" a 11.9
"2014-05-31" a 11.5
"2014-06-30" a 11.88
"2014-01-31" b 6.0
"2014-02-28" b 8.5
"2014-03-31" b 8.2
"2014-04-30" b 8.8
"2014-05-31" b 8.3
"2014-06-30" b 8.9
Run Code Online (Sandbox Code Playgroud)
我试过的代码:
database$date=as.Date(database$date)
monthlyReturn<- function(df) { (df$value[2] - df$value[1])/(df$value[1]) }
mon.returns <- ddply(database, .(name,date), monthlyReturn)
Run Code Online (Sandbox Code Playgroud)
但是,“ monthlyReturn”列的输出为零。
有什么想法吗?
说我有以下内容 data.frame
df <- data.frame(letters = c("a, b", "a", "b", "a, c"), value = c(1, 2, 3, 4))
df
#> letters value
#> 1 a, b 1
#> 2 a 2
#> 3 b 3
#> 4 a, c 4
Run Code Online (Sandbox Code Playgroud)
我要拆分/融化到哪个
#> letters value
#> 1 a 1
#> 2 b 1
#> 3 a 2
#> 4 b 3
#> 5 a 4
#> 6 c 4
Run Code Online (Sandbox Code Playgroud)
为了每个单独记录 letters
我想仅从点(1,1)过滤掉小于10个单位的行.我的数据框有两列,x和y.
这是我尝试过的:
filter(df, dist( rbind(c(1,2), c(x,y)) ) < 10 )
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用.它总是返回0行结果,虽然我知道它应该返回几行.我该怎么调试呢?我想在每次迭代中打印传递给x和y的每个值.
每个请求,这是dput(head(df))的输出:
structure(list(x = c(1, 2, 3, 4, 5), y = c(1, 1, 1, 1, 1)), .Names = c("x",
"y"), row.names = c(NA, 5L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud) 我需要对列之一生成的序列求和.我这样做了:
test <- tibble::tibble(
x = c(1,2,3)
)
test %>% dplyr::mutate(., s = plyr::aaply(x, .margins = 1, .fun = function(x_i){sum(seq(x_i))}))
Run Code Online (Sandbox Code Playgroud)
有更清洁的方法吗?是否有一些帮助函数,构造允许我减少这个:
plyr::aaply(x, .margins = 1, .fun = function(x_i){sum(seq(x_i))})
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个通用的解决方案,这里sum和seq只是一个例子.也许真正的问题是我确实想要在元素上执行函数而不是所有向量.
这是我的真实案例:
test <- tibble::tibble(
x = c(1,2,3),
y = c(0.5,1,1.5)
)
d <- c(1.23, 0.99, 2.18)
test %>% mutate(., s = (function(x, y) {
dn <- dnorm(x = d, mean = x, sd = y)
s <- sum(dn)
s
})(x,y))
test %>% plyr::ddply(., c("x","y"), .fun = function(row) {
dn <- dnorm(x …Run Code Online (Sandbox Code Playgroud) plyr ×10
r ×10
dplyr ×3
data.table ×2
dataframe ×1
financial ×1
reshape2 ×1
tibble ×1
time-series ×1