R 如何解决此错误:类型为';内置&x27;不可再附加
我想找到数据集中所有变量的范围、平均值和sd。我在图片中使用了for循环,但是显示了类型为'builtin'的类似错误的对象是不可子集的。有人知道如何解决这个问题吗R 如何解决此错误:类型为';内置&x27;不可再附加,r,R,我想找到数据集中所有变量的范围、平均值和sd。我在图片中使用了for循环,但是显示了类型为'builtin'的类似错误的对象是不可子集的。有人知道如何解决这个问题吗 > mean <- c() range <- c() sd <- c() > > dyad.all_subset <- subset(dyad.all, select=c(BAA,BAF,`Data > Science`,`Life Science`,Engineer,`Previo
> mean <- c() range <- c() sd <- c()
>
> dyad.all_subset <- subset(dyad.all, select=c(BAA,BAF,`Data
> Science`,`Life Science`,Engineer,`Previous Raised`,`Max
> Raise`,Age,`Patent Numbers`,Patent,`Committed Amount ($K)`))
> dyad.all_subset$BAA <- as.numeric(dyad.all_subset$BAA)
> dyad.all_subset$BAF <- as.numeric(dyad.all_subset$BAF)
> dyad.all_subset$`Data Science` <- as.numeric(dyad.all_subset$`Data
> Science`) dyad.all_subset$`Life Science` <-
> as.numeric(dyad.all_subset$`Life Science`) dyad.all_subset$Engineer <-
> as.numeric(dyad.all_subset$Engineer) dyad.all_subset$`Previous Raised`
> <- as.numeric(dyad.all_subset$`Previous Raised`) dyad.all_subset$`Max
> Raise` <- as.numeric(dyad.all_subset$`Max Raise`) dyad.all_subset$Age
> <- as.numeric(dyad.all_subset$Age) dyad.all_subset$`Patent Numbers` <-
> as.numeric(dyad.all_subset$`Patent Numbers`) dyad.all_subset$Patent <-
> as.numeric(dyad.all_subset$Patent) dyad.all_subset$`Committed Amount
> ($K)` <- as.numeric(dyad.all_subset$`Committed Amount ($K)`)
>
>
>
>
>
> for(i in 1:nrow(dyad.all_subset)){ range[i] <-
> range(dyad.all_subset[[i]],na.rm=T) mean[i] <-
> mean(dyad.all_subset[[i]], na.rm=T) sd[i] <-
> sd(dyad.all_subset[[i]],na.rm=T) }
>平均工资、年龄、专利号、专利、承诺金额($K`))
>二元。所有子集合$BAA二元。所有子集合$BAF二元。所有子集合$`Data Science`Science`)二元。所有子集合$`Life Science`as.numeric(二元。所有子集合$`Life Science`)二元。所有子集合$Engineer as.numeric(二元。所有子集合$`Engineer)二元。所有子集合$`先前提出`
>募集`($K)`
>
>
>
>
>对于(i in 1:nrow(dyad.all_子集)){range[i]range(dyad.all_子集[[i]],na.rm=T)mean[i]mean(dyad.all_子集[[i]],na.rm=T)sd[i]sd(dyad.all_子集[[i]],na.rm=T)}
range
、mean
和sd
的变量。它可能看起来很明显,但在对代码进行故障排除时,可能很难读取(因此也很难维护)
mu
的向量,其中包含每列的平均值<代码>西格玛,每个标准偏差;以及一个名为rng
的矩阵,它有两行,每列的最小值和最大值
cols@r2evan的答案是正确的。但是,要获得更好的实践,请考虑:
1.包装到函数中:
您的代码构成一个逻辑单元。即使您不重用它,您也隔离了它,命名了它,并设定了一些期望
dyad_summary = function(data, columns=NULL){
if(!is.null(columns))
data = subset(data, select=columns)
data[] = lapply(data, as.numeric)
range = sapply(data, range, na.rm=TRUE)
mean = sapply(data, mean, na.rm=TRUE)
sd = sapply(data, sd, na.rm=TRUE)
list("range" = range, "mean" = mean, "sd" = sd)
}
2.使用标准子集而不是subset
subset
是一种很好的速记方法,但只能以交互方式使用
# instead of:
data = subset(data, select=columns)
# write:
data = data[,columns]
# it is even shorter!
3.玩S3课程:
S3类不是真正的面向对象系统,但本质上是轻量级调度系统和命名便利性:
class(dyad) = "dyad"
# Or even better:
class(dyad) = c("dyad", class(dyad))
# Define function with summary generics:
summary.dyad = function(...){
...
}
summary(dyad)
不要担心您不理解“泛型”、“类”或“面向对象”的含义,这基本上是简单S3使用所需了解的所有内容
既然您在那里,summary
函数的类可以是dyad.summary
,您可以通过编写:print.dyad.summary
来创建自己的print
函数
4.记录您的功能:
这将使它们更具可读性,所以下周,当您忘记——为什么——编写函数时,您可以阅读您的文档
#' Summarize Dyad data
#'
#' Converts all or just selected columns to a numeric type,
#' and then returns their mean, standard deviation and range.
#' `NAs` in data or introduced during the conversion are omitted.
#'
#' @param data dyad data
#' @param **optional** vector specifying subset of columns that will be summarized
#' @return a list of mean, standard deviation and range for each column
#' in the dyad data.
summary.dyad = function(data, columns=NULL){
...
}
当以这种格式记录时,如果您想在以后的项目LifePawn中将函数放入一个包中,那么您已经在制作roxygen2
文档了。您需要在循环之前初始化range
、mean
和sd
。R认为你想用这些名字来子集函数,我已经把它们初始化为向量,比如范围,一个很好的做法是永远不要用基R函数来命名变量。如果不进行任何子集设置(使用`[代码的第一行是语法错误。它不会初始化任何内容。还有更多语法错误。请注意换行符。另一个错误:您的range
变量(坏名)正在分配range(.)
函数的返回值(长度为2)因此,即使我们可以重现这一点(我们不能),这也是一个语法错误。艾米,请回答你的问题,(1)正如罗兰所说,注意换行符,这段代码目前在语法上无效,(2)提供dput(head(dyad.all_子集))的输出
。谢谢。变量range
、mean
和sd
没有问题。它们很短,但很容易理解,这就是为什么它们被用来命名函数range()
、mean()
和sd()
。如果没有上下文,或者使用几种不同的方法、范围和标准差,它们就不太合适,但问题在于缺乏上下文或封装,而不是名称本身。最重要的是,将范围
、均值
和sd
更改为rng
,<代码> MU>代码>代码> Sigma 仅用不同的颜色绘制问题。相反,考虑将所有这些打包成<代码>摘要。Dyad 函数和返回<代码>列表(“Mealth=”均值,“SD”=SD,“Real'”=范围)
。此外,subset
是一个不错的快捷方式,但仅供交互使用。您建议在命名列表中换行是很好的。但您关于使用mu
是“用不同的颜色绘制问题”的说法既不完整,也没有抓住要点。问题是某些表达式中存在歧义(这不在OP的代码中);对我来说,切换到mu
是很清楚的(统计类通常使用希腊字母表示),而且更重要的是,它从不含糊不清。虽然变量命名通常是主观的,而不是我争论的问题,但符号含糊不清可以(也会)导致问题。在交互使用之外使用子集
的风险主要取决于其使用非标准评估的能力,此处未使用。(像这样使用子集
的一个优点是,它在data.frame
、tbl_df
和data.table
之间的作用是相同的。我承认用户不一定会互换使用这三种方法,但如果代码是不可知的,那么找到统一的访问通常是有用的。)我偏爱对象不可知子集的子集
。但我被非标准评估所折磨的次数比我构建真正的对象不可知代码的次数还要多。这一切都可能是不错的建议,但远远超出了OPs的能力水平。他们甚至无法注意到R抛出错误!而且,S3类可以快速计算e范围、平均值和标准差?