我遇到了一个应用程序,我需要按列号对data.frame进行排序,而且通常的解决方案似乎都不允许这样做.
上下文正在创建一个as.data.frame.by方法.由于by对象将其最后一列作为值列,而将第一列ncol-1列作为索引列. melt返回它向后排序 - 索引3,然后索引2,然后索引1.为了兼容latex.table.by我想要向前排序.但是我在以足够通用的方式做这件事时遇到了麻烦.下面函数中注释掉的行是迄今为止我最好的尝试.
as.data.frame.by <- function( x, colnames=paste("IDX",seq(length(dim(x))),sep="" ), ... ) {
num.by.vars <- length(dim(x))
res <- melt(unclass(x))
res <- na.omit(res)
colnames(res)[seq(num.by.vars)] <- colnames
#res <- res[ order(res[ , seq(num.by.vars)] ) , ] # Sort the results by the by vars in the heirarchy given
res
}
dat <- transform( ChickWeight, Time=cut(Time,3), Chick=cut(as.numeric(Chick),3) )
my.by <- by( dat, with(dat,list(Time,Chick,Diet)), function(x) sum(x$weight) )
> as.data.frame(my.by)
IDX1 IDX2 IDX3 value
1 …Run Code Online (Sandbox Code Playgroud) 我有一个data.frame(比如说"df")如下所示:
Hospital.Name | State | Mortality.Rate
'hospital_1' | 'AA' | 0.2
'hospital_2' | 'AA' | 0.3
'hospital_3' | 'BB' | 0.3
'hospital_4' | 'CC' | 0.5
Run Code Online (Sandbox Code Playgroud)
(Hospital.Name是唯一的)
现在我想通过"State"命令"Mortality.Rate"组,即将速率命令在某个状态.如果费率存在平局,那么"Hospital.Name"用于解决平局.
我想到了"order()"和"tapply()"函数.我这样编码:
tapply(df$Mortality.Rate, df$State, order, df$Hospital.Name, na.last=NA)
Run Code Online (Sandbox Code Playgroud)
但是,弹出了"参数长度不同"的错误.当"订单"功能应用于切片"费率"时,订单的第二个参数(即df $ Hospital.Name)不会被切片.
我如何将第二个参数(用于解决排序中的关系)传递给tapply()或者是否还有其他方法?
我是R的新手,想要对称为"权重"的数据框进行排序.以下是详细信息:
>str(weights)
'data.frame': 57 obs. of 1 variable:
$ attr_importance: num 0.04963 0.09069 0.09819 0.00712 0.12543 ...
> names(weights)
[1] "attr_importance"
> dim(weights)
[1] 57 1
> head(weights)
attr_importance
make 0.049630556
address 0.090686474
all 0.098185517
num3d 0.007122618
our 0.125433292
over 0.075182467
Run Code Online (Sandbox Code Playgroud)
我想通过降低attr_importance的顺序排序,但我也希望保留相应的行名称.
我试过了:
> weights[order(-weights$attr_importance),]
Run Code Online (Sandbox Code Playgroud)
但它给了我一个"数字"背面.
我想要一个数据帧 - 按attr_importance排序,并且CORRESPONDING行名称保持不变.我怎样才能做到这一点?
提前致谢.
我现在正在摆弄这一段时间,但找不到合理的解决办法.
我想按降序排序data.frame的所有列.
示例数据例如:
CustomData <- data.frame(Value1=rnorm(100,1,2), Value2=rnorm(100,2,3),
Value3=rexp(100,5), Value4=rexp(100,2))
Run Code Online (Sandbox Code Playgroud)
适用于一栏:
CustomData[order(CustomData$Value1, decreasing=FALSE), ]
Run Code Online (Sandbox Code Playgroud)
如何以合理的方式按递减/递增顺序对所有列数据进行排序?谢谢.
我也在其他地方尝试了这样的东西,但是没有按照规定工作.
CustomData[do.call(order, as.list(CustomData)),]
Run Code Online (Sandbox Code Playgroud) 我正在尝试以下功能:
stest <- data.frame(group=c("John", "Jane", "James"), mean=c(3, 5, 1))
transform(stest, group = reorder(group, mean))
Run Code Online (Sandbox Code Playgroud)
并期望输出按 排序mean。相反,我得到:
group mean
1 John 3
2 Jane 5
3 James 1
Run Code Online (Sandbox Code Playgroud)
也就是说,与原始数据帧中的顺序相同。
我错过了什么吗?如何通过数据框的数值变量之一正确排序数据框?
周围的建议是关于使用的reorder,但我无法使其按预期工作。任何加载的包都会干扰吗?
使用data.table,假设我使用两列设置密钥,其中一列缺少值.数据表似乎将NA值排序为第一个值.
require(data.table)
set.seed(919)
# Create sample data
dt <- data.table(
key1 = rep(1:10, each = 10),
key2 = rep_len(letters, 100)
)
# Set some key2 values to missing
dt[sample(1:100, 10), "key2"] <- NA
# Set key (sort)
setkeyv(dt, c("key1", "key2"))
dt
# 1: 1 NA
# 2: 1 a
# 3: 1 b
# 4: 1 c
# 5: 1 d
# 6: 1 f
# 7: 1 g
# 8: 1 h
# 9: 1 i
# …Run Code Online (Sandbox Code Playgroud) 我在R中有一个data.table,我想用插入包
set.seed(42)
trainingRows<-createDataPartition(DT$variable, p=0.75, list=FALSE)
head(trainingRows) # view the samples of row numbers
Run Code Online (Sandbox Code Playgroud)
但是,我无法使用data.table选择行.相反,我必须转换为data.frame
DT_df <-as.data.frame(DT)
DT_train<-DT_df[trainingRows,]
dim(DT_train)
Run Code Online (Sandbox Code Playgroud)
data.table替代方案
DT_train <- DT[.(trainingRows),] requires the keys to be set.
Run Code Online (Sandbox Code Playgroud)
除了转换为data.frame之外还有更好的选择吗?
考虑下面的数据表:
DT <- data.table(a=c(1,2,4,3,5), b=c(3:5,NA,2), c=c(2,1,NA,NA,3))
DT
a b c
1: 1 3 2
2: 2 4 1
3: 4 5 NA
4: 3 NA NA
5: 5 2 3
Run Code Online (Sandbox Code Playgroud)
我想根据第 3 列和第 1 列对行进行排序。我可以使用:
DT[order(DT[,3],DT[,1])]
a b c
1: 2 4 1
2: 1 3 2
3: 5 2 3
4: 3 NA NA
5: 4 5 NA
Run Code Online (Sandbox Code Playgroud)
但是,如果 DT 有很多列并且假设我想根据第 1 到第 i 列对它们进行排序,那么将其写为:
DT[order(DT[,1], DT[,2], DT[,3], ... DT[,i])]
Run Code Online (Sandbox Code Playgroud)
相反,我想提供列索引作为向量(见下文):
DT[order(DT[,c(1:i)])]
Run Code Online (Sandbox Code Playgroud)
但是,它不像我期望的那样工作,输出是:
DT[order(DT[,c(3,1)])]
a b c
1: 2 …Run Code Online (Sandbox Code Playgroud) 大家好,新年快乐,
我有一张不同学习模型的准确性和 kappa 输出的表格,并使用 knit::kable 来显示它们。
我现在想首先按准确度(从顶部最高到底部最低)对模型(行)进行排序,然后在此排序中,根据从最高到最低的 Kappa 对行进行排序。因此,我希望将准确性作为最重要的订单标准,而将 Kappa 作为第二重要的标准。表中还有其他列,但这是我想要对行进行排序的两列。
我在这方面相当缺乏经验,非常感谢您的帮助。我也对其他在 RMarkdown 中生成漂亮表格的函数/库持开放态度,这可以帮助我解决这个问题。
谢谢你,最好的,corkinabottle
我试图在R中的一行中执行多个步骤,以从具有多个条件的data.table(dt)中选择值.
例如:
set.seed(123)
dt <- data.table(id = rep(letters[1:2],2),
time = rnorm(4),
value = rnorm(4)*100)
# id time value
# 1: a -0.56047565 12.92877
# 2: b -0.23017749 171.50650
# 3: a 1.55870831 46.09162
# 4: b 0.07050839 -126.50612
# Now I want to select the last (maximum time) value from id == "a"
# My pseudo data.table code looks like this
dt[order(time) & id == "a" & .N, value]
# [1] 12.92877 46.09162
Run Code Online (Sandbox Code Playgroud)
而不是获取我想要的两个值只有最后一个值(具有更高的时间值).
如果我一步一步地做到这一点:
dt <- dt[order(time) & id …Run Code Online (Sandbox Code Playgroud)