R 与塔普利争论

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

我正在使用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 <- 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))
          })
)