相关疑难解决方法(0)

分组函数(tapply,by,aggregate)和*apply系列

每当我想在R中做一些"map"py时,我通常会尝试使用一个函数 apply家族中.

但是,我从来没有完全理解它们之间的区别 - 如何{ sapply,lapply等}将函数应用于输入/分组输入,输出将是什么样的,甚至输入可以是什么 - 所以我经常只要仔细检查它们,直到我得到我想要的东西.

有人可以解释如何使用哪一个?

我当前(可能不正确/不完整)的理解是......

  1. sapply(vec, f):输入是一个向量.output是一个向量/矩阵,其中element if(vec[i])一个矩阵,如果f有一个多元素输出

  2. lapply(vec, f):相同sapply,但输出是一个列表?

  3. apply(matrix, 1/2, f):输入是一个矩阵.output是一个向量,其中element i是f(矩阵的row/col i)
  4. tapply(vector, grouping, f):output是一个矩阵/数组,其中矩阵/数组中的元素是向量f分组g的值,和g被推送到行/列名称
  5. by(dataframe, grouping, f):让我们g成为一个分组.适用f于组/数据框的每一列.漂亮打印分组和f每列的值.
  6. aggregate(matrix, grouping, f):类似于by,但不是将输出打印得很漂亮,而是将所有内容都粘贴到数据帧中.

侧问题:我还没有学会plyr或重塑-将plyrreshape更换所有这些完全?

r lapply sapply r-faq tapply

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

使用CUT和Quartile在R函数中生成中断

根据之前的一些很好的建议,我现在正在编写我的第二个R函数并使用类似的逻辑.但是,我正在尝试自动化一点,并且可能为了自己的利益而变得过于聪明.

我想根据订单数量将客户分成五分位数.这是我的代码:

# sample data
clientID <- round(runif(200,min=2000, max=3000),0)
orders <- round(runif(200,min=1, max=50),0)

df <- df <- data.frame(cbind(clientID,orders))

#function to break them into quintiles
ApplyQuintiles <- function(x) {
  cut(x, breaks=c(quantile(df$orders, probs = seq(0, 1, by = 0.20))), 
      labels=c("0-20","20-40","40-60","60-80","80-100"))
}

#Add the quintile to the dataframe
df$Quintile <- sapply(df$orders, ApplyQuintiles)
Run Code Online (Sandbox Code Playgroud)

table(df$Quintile)

0-20   20-40   40-60    60-80   80-100 
40     39      44       38      36
Run Code Online (Sandbox Code Playgroud)

你会在这里看到,在我的样本数据中,我创建了200个观察值,但只列出了197个table.剩下的3个是NA

现在,有一些对于五分位数具有"NA"的clientID.看起来如果他们处于最低休息时间,在这种情况下为1,那么他们就不会被包括在切割功能中.

有没有办法cut包容所有观察?

cut r

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

标签 统计

r ×2

cut ×1

lapply ×1

r-faq ×1

sapply ×1

tapply ×1