相关疑难解决方法(0)

Dataframe基于其他列创建新列

我有一个数据帧:

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)

r apply dataframe

10
推荐指数
4
解决办法
4万
查看次数

如何对R中列表的元素应用均值函数

我有一个列表,我想用它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 list lapply

9
推荐指数
2
解决办法
3万
查看次数

计算列意味着基于另一列中的值

可能重复:
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)

任何帮助将不胜感激!

r

9
推荐指数
2
解决办法
3万
查看次数

确定R中两个数据集之间的特定差异

我想比较两个数据集并确定它们之间的差异的具体实例(即哪些变量不同).

虽然我已经找到了如何识别两个数据集之间哪些记录不相同(使用此处详述的功能: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 namevaccinedate.此外,数据集B还有一个不在数据集A中的附加记录,我也希望识别这些实例.

最后,目标是找出错误"类型"的频率,例如有多少记录在疫苗接种,疫苗名称,剂量等方面存在差异.

谢谢!

r

9
推荐指数
2
解决办法
2万
查看次数

使用自定义函数(if语句系列)

我想运行一个查看两个向量的函数,根据两个向量中值的符号返回不同的值.我编写了一个函数来比较两个值,但后来我想在两个向量上运行它.所以我使用了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.

我看不出有什么不对,所以请帮忙!

r apply lapply sapply

7
推荐指数
2
解决办法
8960
查看次数

更快的方法来创建通过id聚合列的变量

有更快的方法吗?我想这是不必要的慢,并且这样的任务可以通过基本功能完成.

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)

performance aggregate r plyr

6
推荐指数
2
解决办法
2945
查看次数

计算一系列csv文件的行数

我正在研究一个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参数的总行数?

r apply lapply

6
推荐指数
1
解决办法
2万
查看次数

在R中循环数据帧长度的正确方法

经过今天的大量调试,令我沮丧的是,我发现:

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中做我想做的事情?

loops r

6
推荐指数
1
解决办法
1万
查看次数

矢量表是指两个因素

我正在学习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)

任何帮助将不胜感激.我知道答案是愚蠢的,但我无法理解它是什么.

r

5
推荐指数
1
解决办法
503
查看次数

什么情况下 `vapply()` 比 `sapply()` 慢?

该函数的文档*apply()指出:

vapply与 类似sapply,但具有预先指定的返回值类型,因此使用起来更安全(有时更快)。[强调我的。]

这对我来说是有道理的,为什么它会更快 - 浪费更少的时间检查类型 - 但是,考虑到他们可以说“与”vapply()一样快或更快sapply(),但选择不这样做,我解释了他们的选择有时比他们更快潜在的意思是“对于大多数任务来说vapply(),平均速度更快,但在某些情况下,平均速度可能相同,或者在其他情况下甚至更慢 ——这对我来说似乎很奇怪。为什么它会变慢?高级 R状态 '比'vapply()更快sapply(),相比之下,这是相当明确的。

我是否误解了这一点,或者是否存在vapply()比 慢的情况sapply(),如果是的话,它们是什么?

例如,其基本原理可能是由于垃圾收集的差异,或者处理某些类型的速度,或者分配内存或其他东西(这些都是疯狂的猜测)。

我所做的研究:

令人惊讶的是,我在 StackOverflow 或其他地方找不到在线解决此问题的方法。有很多问题涉及 vapply及其安全性。在一些 比较中,虽然vapply()与 一样快或更快sapply(),但有许多迭代比最慢的vapply()迭代更快(其中一个迭代比或apply()快得多。长话短说,我有点迷失了!lapply()vapply()

您能提供的任何帮助将不胜感激!

loops r apply lapply sapply

5
推荐指数
1
解决办法
160
查看次数

标签 统计

r ×10

apply ×4

lapply ×4

loops ×2

sapply ×2

aggregate ×1

dataframe ×1

list ×1

performance ×1

plyr ×1