R 与塔普利争论
我正在使用tapply按样本ID(SID)组合一个表。对于列表中的第一个样本,有3个测量值,但它仅显示为一个 我有4件事需要交给新桌子。首先是希德。第二个是具有该SID的所有测量的平均面积。第三是所有的距离。最后是测量次数R 与塔普利争论,r,R,我正在使用tapply按样本ID(SID)组合一个表。对于列表中的第一个样本,有3个测量值,但它仅显示为一个 我有4件事需要交给新桌子。首先是希德。第二个是具有该SID的所有测量的平均面积。第三是所有的距离。最后是测量次数 cases_iTLS <- data.frame(unique(iTLS$SID)) colnames(cases_iTLS)[colnames(cases_iTLS)=="unique.iTLS.SID."] <- "SID" cases_iTLS$SID &l
cases_iTLS <- data.frame(unique(iTLS$SID))
colnames(cases_iTLS)[colnames(cases_iTLS)=="unique.iTLS.SID."] <- "SID"
cases_iTLS$SID <- factor(cases_iTLS$SID)
# Average of TLS on one slide for area
cases_iTLS$Area_iTLS <- tapply(iTLS$Area, iTLS$SID,FUN=mean)
# Average of TLS on one slide for distance
cases_iTLS$Distance_iTLS <- tapply(iTLS$Distance, iTLS$SID,FUN=mean)
# Number of measurements per SID
cases_iTLS$Count_iTLS <- tapply(iTLS$Region_Index, iTLS$SID,FUN=length)
SID Region_index Area Distance Type Location
112906 1 53531.53 71.982 iTLS intratumoral
112906 3 76809.61 97.384 iTLS intratumoral
112906 5 40937.30 9.643 iTLS intratumoral
112947 1 35071.66 2.067 iTLS intratumoral
112947 3 17979.88 36.319 iTLS
<代码> CASE SITITLS
,因为您需要跨多个列(区域、距离和SID)运行单独的聚合函数(<代码>平均< /代码>和<代码>长度>代码>),考虑使用<代码>聚合< /代码>进行分组聚合以返回数据帧。 通常,
tapply
在单个数值度量上运行,而不是跨列或函数运行,以返回单个命名的原子向量。下面调用一个do.call
+data.frame
来绑定多个聚合的嵌套结果
聚合
# AGGREGATE ACROSS COLS AND FUNCS
cases_iTLS <- aggregate(cbind(Area, Distance, Region_Index) ~ SID, iTLS,
function(x) c(mean=mean(x), count = length(x))
# BIND NESTED, UNDERLYING RESULTS
cases_iTLS <- do.call(data.frame, cases_iTLS)
# KEEP NEEDED COLUMNS
cases_iTL <- cases_iTL[c("SID", "Area.mean", "Distance.mean", "Region_Index.count")
作者
# AGGREGATE ACROSS COLS AND FUNCS
cases_iTLS <- aggregate(cbind(Area, Distance, Region_Index) ~ SID, iTLS,
function(x) c(mean=mean(x), count = length(x))
# BIND NESTED, UNDERLYING RESULTS
cases_iTLS <- do.call(data.frame, cases_iTLS)
# KEEP NEEDED COLUMNS
cases_iTL <- cases_iTL[c("SID", "Area.mean", "Distance.mean", "Region_Index.count")
我不想指出的(面向对象的包装器是tapply
):
你的问题是什么?代码的错误或意外结果是什么?第一个示例的输出为Count_iTLS=1。但在输入中有3行具有唯一的区域索引。所需输出应为Count_iTLS=3。另外,另外两个tapply给出的方法不正确。没有结构或数据的例子很难回答。由于使用或未使用NA
,平均值是否为假:@phili_b我在主要问题中添加了数据结构。数据中没有包含dput(myvariable)
的单元格。放在这里,结构更容易测试:)这似乎有效。我只是对“保留需要的专栏”部分有疑问。我是否需要使用这些名称来调用函数,或者只是重命名columnsPeriod限定名源自对列的聚合调用,但可以在以后或在c()
函数中重命名。具体来说,在aggregate
中,c(Andre_func=mean(x))
在末尾呈现为区域。Andre_func
。
cases_iTL_mat <- do.call(rbind,
by(iTLS, iTLS$SID, function(sub) {
c(Area_mean = mean(sub$Area),
Distance_mean = mean(sub$Distance),
Region_count = length(sub$Region_Index))
})
)