我试图通过一个因子创建一个具有最大记录数据的数据框.我想要一个4行数据帧(每个G一个),该组中X的最大值和相应的Y值.我知道我可以写一个循环但不愿意.
Data<-data.frame(X=rnorm(200), Y=rnorm(200), G=rep(c(1,2,3,4), each=50))
XMax<-tapply(Data$X, Data$G, function(x){max(x, na.rm=T)})
WhichXMax<-tapply(Data$X, Data$G, function(x){which.max(x)})
Run Code Online (Sandbox Code Playgroud)
which.max函数在数据被tapply因子子集化后返回行号,我真的希望行号引用数据行.所以我可以这样做;
YMax<-Data$Y[Which]
MaxData<-data.frame(XMax=XMax, YMax=YMax, G=levels(Data$G))
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个函数,如果存在一个shell命令将返回1,否则我知道有一个which命令返回命令的路径(如果存在).它还在手册中说该命令应该具有返回值,但是尝试set a = `which some_command.bin`不会输入任何值a.我知道我总是可以使用which然后解析结果,我只是在寻找一个更清洁的解决方案
嗨我在R中有一个函数,我正在尝试优化性能.我需要向量化循环.我的问题是稍微复杂的数据结构以及我需要使用'which'命令执行查找的方式.
假设我们正在处理5个元素(1,2,3,4,5),10x2矩阵对是5个元素的所有唯一对的组合(即(1,2),(1,3),(1) ,4)....(4,5)).all_prods是一个10x1矩阵,我需要在迭代所有5个元素时使用这些对查找.
因此,对于1,我需要从all_prods索引行1,2,3,4(对1,2 1,3 1,4和1,5),依此类推1,2,3,4,5.
我最近才从matlab切换到R,所以非常感谢任何帮助.
foo <- function(AA , BB , CC ){
pa <- AA*CC;
pairs <- t(combn(seq_len(length(AA)),2));
all_prods <- pa[pairs[,1]] * pa[pairs[,2]];
result <- matrix(0,1,length(AA));
# WANT TO VECTORIZE THIS BLOCK
for(st in seq(from=1,to=length(AA))){
result[st] <- sum(all_prods[c(which(pairs[,1]==st), which(pairs[,2]==st))])*BB[st];
}
return(result);
}
AA <- seq(from=1,to=5); BB<-seq(from=11,to=15); CC<-seq(from=21,to=25);
results <- foo(AA,BB,CC);
#final results is [7715 164208 256542 348096 431250]
Run Code Online (Sandbox Code Playgroud)
我想将for循环转换为矢量化版本.我不想循环遍历每个元素st,而是想在一个命令中完成它,它给出了一个结果向量(而不是逐个元素地构建它)
提前致谢.
我一直在使用R which函数从数据框中删除行.我最近发现,如果搜索词不在data.frame中,则结果为空字符.
# 1: returns A-Q, S-Z (as expected)
LETTERS[-which(LETTERS == "R")]
# 2: returns "character(0)" (not what I would expect)
LETTERS[-which(LETTERS == "1")]
# 3: returns A-Z (expected)
LETTERS[which(LETTERS != "1")]
# 4: returns A-Q, S-Z (expected)
LETTERS[which(LETTERS != "R")]
Run Code Online (Sandbox Code Playgroud)
第二个例子-which()是未找到搜索词时的预期行为吗?我已经将代码切换为使用示例4中的语法,这似乎更安全,但我只是好奇.
比方说,我有以下结构:
/usr/bin/app
/home/me/bin/app
Run Code Online (Sandbox Code Playgroud)
并$/usr/bin/app --version- - v1,$/home/me/bin/app --version- > v2.
所以,当我执行一些命令时,比如说$app --version,它会返回v1,但是我$which app给了我/home/me/bin/app,所以,我想,它必须执行第二个应用程序,然后返回v2.为什么不发生?
换句话说,结构是否$app等同于$$(which app),并且因此不适用?
任何人都可以向我解释为什么会发生以下情况?
[$] pip
-bash: /usr/local/bin/pip: No such file or directory
[$] which pip
/bin/pip
Run Code Online (Sandbox Code Playgroud) 这是我正在使用的代码:
x <- c("Yes","No","No","Yes","Maybe")
y <- t(1:10)
z <- t(11:20)
rbind.data.frame(ifelse(x == "Yes",y,z))
Run Code Online (Sandbox Code Playgroud)
这产生了
X1L X12L X13L X4L X15L
1 1 12 13 4 15
Run Code Online (Sandbox Code Playgroud)
期望的结果是:
x
1 Yes 1 2 3 4 5 6 7 8 9 10
2 No 11 12 13 14 15 16 17 18 19 20
3 No 11 12 13 14 15 16 17 18 19 20
4 Yes 1 2 3 4 5 6 7 8 9 10
5 Maybe 11 12 13 …Run Code Online (Sandbox Code Playgroud) 我想用magrittr的管道重写以下代码:
max(diff(which(diff(runif(50)) > 0 )))
Run Code Online (Sandbox Code Playgroud)
我直截了当的做法是:
library(magrittr)
runif(50) %>% diff > 0 %>% which %>% diff %>% max
Run Code Online (Sandbox Code Playgroud)
但这种失败是由于(第一),其中:
runif(50) %>% diff > 0 %>% which
Run Code Online (Sandbox Code Playgroud)
错误,其中(.):'which'的参数不合逻辑
我不确定为什么会发生这种错误以及为什么管道与管道连接到其他函数不同,因为"diff> 0"的输出是一个逻辑向量.
在旁注中,直言不讳地说,是否有办法进行比较
runif(50) %>% diff %>% > 0
Run Code Online (Sandbox Code Playgroud)
谢谢你的建议!
我有一个包含3列和总共10,000个元素的矩阵.第一列和第二列是索引,第三列是分数.我想根据以下公式对得分列进行标准化:
Normalized_score_i_j = score_i_j / ((sqrt(score_i_i) * (sqrt(score_j_j))
Run Code Online (Sandbox Code Playgroud)
score_i_j =当前得分本身
score_i_i =查看第一列中当前得分的索引,并在数据集中查找在第一列和第二列中都包含该索引的得分
score_j_j =在第二列中查看当前得分的索引,并在数据集中查找在第一列和第二列中都包含该索引的得分
例如,如果df如下:
df <- read.table(text = "
First.Protein,Second.Protein,Score
1,1,25
1,2,90
1,3,82
1,4,19
2,1,90
2,2,99
2,3,76
2,4,79
3,1,82
3,2,76
3,3,91
3,4,33
4,1,28
4,2,11
4,3,99
4,4,50
", header = TRUE, sep = ",")
Run Code Online (Sandbox Code Playgroud)
如果我们正常化这一行:
First.Protein Second.Protein Score
4 3 99
Run Code Online (Sandbox Code Playgroud)
标准化分数为:
得分本身除以得分的sqrt,其First.Protein和Second.Protein指数均为4乘以其First.Protein和Second.Protein指数均为3的得分的sqrt.
因此:
Normalized = 99 / (sqrt(50) * sqrt(91)) = 1.467674
Run Code Online (Sandbox Code Playgroud)
我有下面的代码,但它表现得非常奇怪,并且给我的值根本没有标准化,实际上非常奇怪:
for(i in 1:nrow(Smith_Waterman_Scores))
{
Smith_Waterman_Scores$Score[i] <-
Smith_Waterman_Scores$Score[i] /
(sqrt(Smith_Waterman_Scores$Score[which(Smith_Waterman_Scores$First.Protein==Smith_Waterman_Scores$First.Protein[i] & Smith_Waterman_Scores$Second.Protein==Smith_Waterman_Scores$First.Protein[i])])) *
(sqrt(Smith_Waterman_Scores$Score[which(Smith_Waterman_Scores$First.Protein==Smith_Waterman_Scores$Second.Protein[i] & Smith_Waterman_Scores$Second.Protein==Smith_Waterman_Scores$Second.Protein[i])]))
}
Run Code Online (Sandbox Code Playgroud) 关于使用R,我是一个完全的初学者.我想知道是否有人可以帮我设置哪个功能.我有以下代码:
n_repeats <- 1000
result <- rep(0, 1000)
for (i in 1:n_repeats) {
sample_population<-rnorm(n = 20, mean = 0, sd = 1)
result[i] <- t.test(sample_population)$p.value
}
Run Code Online (Sandbox Code Playgroud)
我希望使用which函数来确定我观察到p值小于0.1,0.05和0.01的次数