我有一個數據幀df,其中每個主題記錄一個數字列表/向量,用於兩次重複的測試項目。最有效的方法來替換數據幀中的最低列表值R
subj item rep vec
s1 1 1 [2,1,4,5,8,4,7]
s1 1 2 [1,1,3,4,7,5,3]
s1 2 1 [6,5,4,1,2,5,5]
s1 2 2 [4,4,4,0,1,4,3]
s2 1 1 [4,6,8,7,7,5,8]
s2 1 2 [2,5,4,5,8,1,4]
s2 2 1 [9,3,2,6,6,8,5]
s2 2 2 [7,1,2,3,2,7,3]
對於每個項目,我想找到50%代表1的平均值,然後替換最低編號與0中的rep 2矢量,直到REP2的平均值小於或等於REP1的平均。例如,對於S1 ITEM1:
mean(c(2,1,4,5,8,4,7))*0.5 = 2.1 #rep1 scaled down
mean(c(1,1,3,4,7,5,3)) = 3.4 #rep2
mean(c(0,0,0,0,7,5,0)) = 1.7 #new rep2 such that mean(rep2) <= mean(rep1)
在代表2矢量除去最低號碼後,我想關聯的REP1和REP2矢量,並執行一些其它少量的算術函數,並將結果附加到另一個(長度初始化)數據幀。現在,我正在用類似於這個僞代碼的循環來做這件事:
for subj in subjs:
for item in items:
while mean(rep2) > mean(rep1)*0.5:
rep2 = replace(lowest(rep2),0)
newDataFrame[i] = correl(rep1,rep2)
用循環做這件事似乎真的很低效;在R中,是否有更有效的方法來查找和替換列表/矢量中的最低值,直到平均值小於或等於取決於特定項目的值爲止?將相關性和其他結果附加到其他數據框的最佳方法是什麼?
附加信息:
>dput(df)
>structure(list(subj = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L), .Label = c("s1", "s2"), class = "factor"), item = c(1L,
1L, 2L, 2L, 1L, 1L, 2L, 2L), rep = c(1L, 2L, 1L, 2L, 1L, 2L,
1L, 2L), vec = list(c(2, 1, 4, 5, 8, 4, 7), c(1, 1, 3, 4, 7,
5, 3), c(6, 5, 4, 1, 2, 5, 5), c(4, 4, 4, 0, 1, 4, 3), c(4, 6,
8, 7, 7, 5, 8), c(2, 5, 4, 5, 8, 1, 4), c(9, 3, 2, 6, 6, 8, 5
), c(7, 1, 2, 3, 2, 7, 3))), .Names = c("subj", "item", "rep",
"vec"), row.names = c(NA, -8L), class = "data.frame")
我想這個數據幀作爲輸出(與REP1與REP2相關和REP1 VS新REP2相關)。
subj item origCorrel newCorrel
s1 1 .80 .51
s1 2 .93 .34
s2 1 .56 .40
s2 2 .86 .79
如果您可以在您的問題中添加'dput(subjs)'的輸出以及此數據集的所需輸出,那將會很棒。 – GSee
對不起,你說過「我有一個數據框,裏面有數字列表/向量」;我認爲這是'subjs'。請提供'data.frame'的'dput' – GSee
您的僞代碼與您的敘述有點不一致。我想你想要在僞代碼中顛倒不平等。 – Seth