我有一个数据帧:
df <- data.frame('a'=c(1,2,3,4,5), 'b'=c(1,20,3,4,50))
df
a b
1 1 1
2 2 20
3 3 3
4 4 4
5 5 50
Run Code Online (Sandbox Code Playgroud)
我想基于现有列创建一个新列.像这样的东西:
if (df[['a']] == df[['b']]) {
df[['c']] <- df[['a']] + df[['b']]
} else {
df[['c']] <- df[['b']] - df[['a']]
}
Run Code Online (Sandbox Code Playgroud)
问题是if只检查第一行的条件...如果我从上面的if语句创建一个函数然后我使用apply()(或mapply()...),它是相同的.
在Python/pandas中我可以使用它:
df['c'] = df[['a', 'b']].apply(lambda x: x['a'] + x['b'] if (x['a'] == x['b']) \
else x['b'] - x['a'], axis=1)
Run Code Online (Sandbox Code Playgroud)
我希望在R中有类似的东西.所以结果看起来像这样:
a b c
1 1 1 2
2 …Run Code Online (Sandbox Code Playgroud) 我有一个列表,我想用它lapply()来计算其元素的平均值.例如,对于列表中的第七项,我有:
>list[[7]]
[1] 1 1 1 1 1 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)
我的输出应该是:
> mean(temp[[7]][1:10])
[1] 1
Run Code Online (Sandbox Code Playgroud)
但是,当我lapply()在下面使用时,结果将是另一回事.我该怎么办?
> lapply(list[[7]][1:10],mean)
[[1]]
[1] 1
[[2]]
[1] 1
.
.
.
[[10]]
[1] 1
Run Code Online (Sandbox Code Playgroud) 可能重复:
R分组功能:sapply vs. lapply与apply.vs. tapply vs. by vs. aggregate vs.
我正在使用R,并希望得到一些我正在遇到的问题的帮助:
我有一个df带有列ID和列Emotion 的dataframe().ID中的每个值对应Emotion中的40-300个值(因此它不是设定的数字).我需要计算Emotion每个j in 的所有i的平均值ID.所以这就是数据的样子
df$ID = (1, 1, 1, 1, 2, 2, 3)
df$Emotion = (2, 4, 6, 4, 1, 1, 8)
Run Code Online (Sandbox Code Playgroud)
因此,手段的向量应如下所示: (4, 1, 8)
任何帮助将不胜感激!
我想比较两个数据集并确定它们之间的差异的具体实例(即哪些变量不同).
虽然我已经找到了如何识别两个数据集之间哪些记录不相同(使用此处详述的功能:http://www.cookbook-r.com/Manipulating_data/Comparing_data_frames/),但我不知道如何标志哪些变量不同.
例如
数据集A:
id name dob vaccinedate vaccinename dose
100000 John Doe 1/1/2000 5/20/2012 MMR 4
100001 Jane Doe 7/3/2011 3/14/2013 VARICELLA 1
Run Code Online (Sandbox Code Playgroud)
数据集B:
id name dob vaccinedate vaccinename dose
100000 John Doe 1/1/2000 5/20/2012 MMR 3
100001 Jane Doee 7/3/2011 3/24/2013 VARICELLA 1
100002 John Smith 2/5/2010 7/13/2013 HEPB 3
Run Code Online (Sandbox Code Playgroud)
我想确定哪些记录不同,哪些特定变量有差异.例如,John Doe记录中有1个差异dose,Jane Doe记录有2个差异:in name和vaccinedate.此外,数据集B还有一个不在数据集A中的附加记录,我也希望识别这些实例.
最后,目标是找出错误"类型"的频率,例如有多少记录在疫苗接种,疫苗名称,剂量等方面存在差异.
谢谢!
我想运行一个查看两个向量的函数,根据两个向量中值的符号返回不同的值.我编写了一个函数来比较两个值,但后来我想在两个向量上运行它.所以我使用了sapply,但是我得到的结果与预期不同.
bear.correction<- function(x,y){
if(x > 0 && y < 0){
return(90)
}else if(x < 0 && y < 0){
return(180)
}else if(x < 0 && y > 0){
return(270)
}else return(0)
}
Run Code Online (Sandbox Code Playgroud)
以下给出了预期的(和期望的)结果:
bear.correction(1,-1)
bear.correction(1,1)
bear.correction(-1,1)
bear.correction(-1,-1)
Run Code Online (Sandbox Code Playgroud)
结果:90,0,270,180
然而,当我尝试进行相同的比较,但使用带有sapply的向量时,我得到了不同的结果:
x <- c(1,1,-1,-1)
y <- c(-1,1,1,-1)
sapply(x,bear.correction,y)
Run Code Online (Sandbox Code Playgroud)
结果:90,90,180,180.
我看不出有什么不对,所以请帮忙!
有更快的方法吗?我想这是不必要的慢,并且这样的任务可以通过基本功能完成.
df <- ddply(df, "id", function(x) cbind(x, perc.total = sum(x$cand.perc)))
Run Code Online (Sandbox Code Playgroud)
我是很新的R.我已经看过了by(),aggregate()和tapply(),但并没有让他们在所有或我想要的方式工作.我希望将总和附加到原始数据帧,而不是返回较短的向量.做这个的最好方式是什么?
编辑:这是应用于我的数据的答案的速度比较.
> # My original solution
> system.time( ddply(df, "id", function(x) cbind(x, perc.total = sum(x$cand.perc))) )
user system elapsed
14.405 0.000 14.479
> # Paul Hiemstra
> system.time( ddply(df, "id", transform, perc.total = sum(cand.perc)) )
user system elapsed
15.973 0.000 15.992
> # Richie Cotton
> system.time( with(df, tapply(df$cand.perc, df$id, sum))[df$id] )
user system elapsed
0.048 0.000 0.048
> # John
> system.time( …Run Code Online (Sandbox Code Playgroud) 我正在研究一个R教程并怀疑我必须使用其中一个函数,但我不确定哪个(是的,我研究了它们,但直到我对R术语更加流利,它们都很混乱).
在我的工作目录中有一个文件夹"specdata".Specdata包含数百个名为001.csv - 300.csv的CSV文件.
我正在处理的函数必须计算输入数量的csv文件的总行数.因此,如果函数中的参数是,1:10并且每个文件都有十行,则返回100.
这是我到目前为止所拥有的:
complete <- function(directory,id = 1:332) {
setpath <- paste("/Users/gcameron/Desktop",directory,sep="/")
setwd(setpath)
csvfile <- sprintf("%03d.csv", id)
file <- read.csv(csvfile)
nrow(file)
}
Run Code Online (Sandbox Code Playgroud)
当ID参数是一个数字(例如17)时,这可以工作.但是,如果我输入说10:50作为参数,我收到一个错误:
Error in file(file, "rt") : invalid 'description' argument
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能计算输入ID参数的总行数?
经过今天的大量调试,令我沮丧的是,我发现:
for (i in 1:0) {
print(i)
}
Run Code Online (Sandbox Code Playgroud)
实际上在R中分别打印1和0.问题出现在写作时
for (i in 1:nrow(myframe) {
fn(i)
}
Run Code Online (Sandbox Code Playgroud)
如果nrow(myframe)== 0,我原本打算不执行.是正确的纠正:
if (nrow(myvect) != 0) {
for (i in 1:nrow(myframe) {
fn(i)
}
}
Run Code Online (Sandbox Code Playgroud)
或者是否有更合适的方式在R中做我想做的事情?
我正在学习R,我向你保证我已经高低搜索了这个答案.这很简单,但出于某种原因,我无法理解我的生活!
我有一个包含一个数字向量和两个因素的数据框:
team.weight <- c(150,160,120,100) # player's weight
team.jersey <- factor(c("blue", "green", "blue", "blue")) # player's jersey color
team.sex <- factor(c("male", "female", "female", "male")) # player's sex
team <- data.frame(team.jersey, team.sex, team.weight)
Run Code Online (Sandbox Code Playgroud)
我想显示一个表(我忘记它叫什么),显示所有玩家的平均权重,即平均值(team.weight),用于两个因子表的每个级别组合.
我可以手动完成,但必须有更好的方法!
mean(team.weight[c(team.jersey[1],team.sex[1])])
mean(team.weight[c(team.jersey[1],team.sex[2])])
mean(team.weight[c(team.jersey[1],team.sex[3])])
mean(team.weight[c(team.jersey[1],team.sex[4])])
mean(team.weight[c(team.jersey[2],team.sex[1])])
mean(team.weight[c(team.jersey[2],team.sex[2])])
mean(team.weight[c(team.jersey[2],team.sex[3])])
mean(team.weight[c(team.jersey[2],team.sex[4])])
mean(team.weight[c(team.jersey[3],team.sex[1])])
mean(team.weight[c(team.jersey[3],team.sex[2])])
mean(team.weight[c(team.jersey[3],team.sex[3])])
mean(team.weight[c(team.jersey[3],team.sex[4])])
mean(team.weight[c(team.jersey[4],team.sex[1])])
mean(team.weight[c(team.jersey[4],team.sex[2])])
mean(team.weight[c(team.jersey[4],team.sex[3])])
mean(team.weight[c(team.jersey[4],team.sex[4])])
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.我知道答案是愚蠢的,但我无法理解它是什么.
该函数的文档*apply()指出:
vapply与 类似sapply,但具有预先指定的返回值类型,因此使用起来更安全(有时更快)。[强调我的。]
这对我来说是有道理的,为什么它会更快 - 浪费更少的时间检查类型 - 但是,考虑到他们可以说“与”vapply()一样快或更快sapply(),但选择不这样做,我解释了他们的选择有时比他们更快潜在的意思是“对于大多数任务来说vapply(),平均速度更快,但在某些情况下,平均速度可能相同,或者在其他情况下甚至更慢” ——这对我来说似乎很奇怪。为什么它会变慢?高级 R状态 '比'vapply()更快sapply(),相比之下,这是相当明确的。
我是否误解了这一点,或者是否存在vapply()比 慢的情况sapply(),如果是的话,它们是什么?
例如,其基本原理可能是由于垃圾收集的差异,或者处理某些类型的速度,或者分配内存或其他东西(这些都是疯狂的猜测)。
令人惊讶的是,我在 StackOverflow 或其他地方找不到在线解决此问题的方法。有很多问题涉及 vapply及其安全性。在一些 比较中,虽然vapply()与 一样快或更快sapply(),但有许多迭代比最慢的vapply()迭代更快(其中一个迭代比或apply()快得多。长话短说,我有点迷失了!lapply()vapply()
您能提供的任何帮助将不胜感激!