这是一个示例数据框:
d <- data.frame(
x = runif(90),
grp = gl(3, 30)
)
Run Code Online (Sandbox Code Playgroud)
我想要d包含x每个值的前5个值的行的子集grp.
使用base-R,我的方法是这样的:
ordered <- d[order(d$x, decreasing = TRUE), ]
splits <- split(ordered, ordered$grp)
heads <- lapply(splits, head)
do.call(rbind, heads)
## x grp
## 1.19 0.8879631 1
## 1.4 0.8844818 1
## 1.12 0.8596197 1
## 1.26 0.8481809 1
## 1.18 0.8461516 1
## 1.29 0.8317092 1
## 2.31 0.9751049 2
## 2.34 0.9269764 2
## 2.57 0.8964114 2
## 2.58 0.8896466 2 …Run Code Online (Sandbox Code Playgroud) 我有一个data.table dumdt:
set.seed(123)
dumdt <- data.table(v1=sample(1:10, 5), v2=1:5)
Run Code Online (Sandbox Code Playgroud)
我想在这个特定的索引顺序中重新排序的行(首先是第三个观察,然后是第五个,然后是第二个,等等):
to_ord <- c(3, 5, 2, 1, 4)
Run Code Online (Sandbox Code Playgroud)
所以我想dumdt成为结果,dumdt[to_ord]但我也希望通过引用来做,并避免这样做dumdt <- dumdt[to_ord].
我知道我可以通过引用setorder(或setorderv)重新排序行,但只能按照一个或多个变量,按升序或降序排序,而不是按自定义顺序排序.
但是,如果我想按照自定义顺序重新排序列,而不是行,我可以使用setcolorder.
所以这里有我的问题:是否有一个函数可以像setcolorder行一样工作(或者用一种方法setorder来做同样的事情)?
我想要的输出就像是
setroworder(x=dumdt, neworder=to_ord)
dumdt
# v1 v2
# 1: 4 3
# 2: 6 5
# 3: 8 2
# 4: 3 1
# 5: 7 4
Run Code Online (Sandbox Code Playgroud) 最近,我遇到的table功能行为并非我所期望的:
例如,让我们采取以下向量:
ex_vec <- c("Non", "Non", "Nan", "Oui", "NaN", NA)
Run Code Online (Sandbox Code Playgroud)
如果我检查NA向量中的值,"NaN"则不被视为一个(如预期的那样):
is.na(ex_vec)
# [1] FALSE FALSE FALSE FALSE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)
但如果我试图获得不同的值频率:
table(ex_vec)
#ex_vec
#Nan Non Oui
# 1 2 1
Run Code Online (Sandbox Code Playgroud)
"NaN" 没有出现在表格中.
但是,如果我"要求" table显示NA值,我会得到:
table(ex_vec, useNA="ifany")
#ex_vec
# Nan NaN Non Oui <NA>
# 1 1 2 1 1
Run Code Online (Sandbox Code Playgroud)
因此,字符串"NaN"被视为调用NA内部的值table,而在输出中将其视为非NA值.
我知道(这会更好)我可以通过将我的矢量转换为a来解决我的问题factor但是,我真的很想知道这里发生了什么.有没有人有想法?
我正在使用调查数据集.它有两个字符串vectors,start并且finish,表示当采访开始,成品,分别是一天的时间.
它们是character看起来像:"9:24 am","12:35 pm"等等的字符串.我试图根据这两个来计算面试的持续时间.这样做的最佳方式是什么?
我知道,对于日期,有很多的classeS或function好像as.date(),as.Date(),chron(),或as.POSIXct().所以我一直在寻找类似的东西as.time(),却找不到它.我是否应该附上一个补充日期并将整个事情转换为POSIX()日期时间class,然后使用difftime()?
处理时间的最佳做法是R什么?
我有12 data.frame秒钟可以使用.它们是相似的,我必须对每个进行相同的处理,所以我写了一个函数,它接受一个data.frame,处理它,然后返回一个data.frame.这有效.但我担心我会绕过一个非常大的结构.我可能正在制作临时副本(是吗?)这样做效率不高.避免data.frame四处走动的最佳方法是什么?
doSomething <- function(df) {
// do something with the data frame, df
return(df)
}
Run Code Online (Sandbox Code Playgroud) 假设我有这个data.table(实际数据是25061 x 5862):
require(data.table)
df
# gene P1 P2 P3 P4 P5
# 1: gene1 0.111 0.319 0.151 NA -0.397
# 2: gene10 1.627 2.252 1.462 -1.339 -0.644
# 3: gene2 -1.766 -0.056 -0.369 1.910 0.981
# 4: gene3 -1.346 1.283 0.322 -0.465 0.403
# 5: gene4 -0.783 NA -0.005 1.761 0.066
# 6: gene5 0.386 -0.309 -0.886 -0.072 0.161
# 7: gene6 0.547 -0.144 -0.725 -0.133 1.059
# 8: gene7 0.785 -1.827 0.986 1.555 -0.798
# 9: gene8 -0.186 …Run Code Online (Sandbox Code Playgroud) 我试图在数据框中提取第7到第14列.然而
df[0:3] 只给出第1到第3行.
如果我想查找列,有谁知道我该怎么办?
我知道如何使用列名这样做,df['a']但由于名称太多,我只想输入类似于df[,7:14]R的内容.
提前致谢.
使用以下代码:
library(gplots)
heatmap.2(as.matrix(mtcars),density.info="none",trace="none",Colv=FALSE,Rowv=FALSE,dendrogram="none",margin=c(10,10))
Run Code Online (Sandbox Code Playgroud)
我可以创建热图.但我想要做的是添加给定块的水平分隔符:

假设我有3个块定义为列表:
block1 <- c("Mazda RX4","Mazda RX4 Wag","Datsun 710","Hornet 4 Drive","Hornet Sportabout","Valiant","Duster 360","Merc 240D")
block2 <- c("Merc 230","Merc 280","Merc 280C","Merc 450SE","Merc 450SL","Merc 450SLC","Cadillac Fleetwood", "Lincoln Continental","Chrysler Imperial" ,"Fiat 128","Honda Civic","Toyota Corolla","Toyota Corona","Dodge Challenger","AMC Javelin")
block3 <- c("Camaro Z28","Pontiac Firebird","Fiat X1-9","Porsche 914-2","Lotus Europa","Ford Pantera L","Ferrari Dino","Maserati Bora","Volvo 142E")
Run Code Online (Sandbox Code Playgroud) 我很新,data.table但想用它来解决我的问题,因为我觉得它比使用"常规"data.frames快1000倍.
这是我的问题:
是)我有的:
2个data.tables dt1和dt2像这样:
dt1 <- data.table(SID=paste0("S", 1:15), Chromo=rep(1:3, e=5), PP=rep(1:5, 3), P1=0, P2=0, P3=0)
set.seed(17)
dt2 <- data.table(PID=rep(paste0("P", 1:3), c(2, 6, 3)), Chr=c(1, 3, 1, 1, 2, 3, 3, 3, 2, 2, 3), start= c(1, 1, 1, 4, 2, 1, 2, 4, 2, 4, 2), end=c(3, 4, 2, 5, 4, 1, 3, 5, 3, 5, 5), val=rnorm(11))
Run Code Online (Sandbox Code Playgroud)
我想要的是:
填充dt1与dt2[, val]在右列的基础上,dt2[, PID]和右线,基于dt1[, Chromo]= dt2[, Chr]和 …
我试图在函数中使用data.table,我试图理解为什么我的代码失败.我有一个data.table如下:
DT <- data.table(my_name=c("A","B","C","D","E","F"),my_id=c(2,2,3,3,4,4))
> DT
my_name my_id
1: A 2
2: B 2
3: C 3
4: D 3
5: E 4
6: F 4
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用不同的"my_id"值创建所有"my_name"对,对于DT,它将是:
Var1 Var2
A C
A D
A E
A F
B C
B D
B E
B F
C E
C F
D E
D F
Run Code Online (Sandbox Code Playgroud)
我有一个函数来返回"my_id"的所有对"my_name",这对值"my_id"按预期工作.
get_pairs <- function(id1,id2,tdt) {
return(expand.grid(tdt[my_id==id1,my_name],tdt[my_id==id2,my_name]))
}
> get_pairs(2,3,DT)
Var1 Var2
1 A C
2 B C
3 A D
4 B D
Run Code Online (Sandbox Code Playgroud)
现在,我想对所有id对执行此函数,我尝试通过查找所有id对然后使用mapply和get_pairs函数来执行此操作.
> combn(unique(DT$my_id),2)
[,1] …Run Code Online (Sandbox Code Playgroud)