[英]How to iterate over a list which is a subset, in R
我對 R 很陌生並且有一些問題。 我有一個大約有 6700 行和 1700 列的數據框。 我想用一個名為“模擬器”的包運行一些模擬。 使用這個包,你需要輸入數據框的兩列的名稱(在下面的代碼行中,它們是 J,j)然后模擬運行。
sim_par <- hapmap2gamete(geno = geno1[,c(J,j)], map = map, ref = ref, chr2exclude = 22)
我想增加腳本的自動化。 我創建了一個包含兩列的列表,每列都包含數據框中列的名稱。 我希望模擬貫穿列表的每一行。 我怎么能做到? 目前,我僅在使用單列列表對數據框進行子集化,然后使用以下代碼行后才設法運行模擬
for (J in 1:(ncol(geno1)-1)){
for (j in (J+1):ncol(geno1)){
但這意味着我得到了很多不需要的模擬,我只需要帶有兩列的列表中的特定模擬。
任何建議將不勝感激。
如果您有一個較小的示例數據集和預期的輸出示例,它會有所幫助,但聽起來如果您有一個列名稱數據框,您可以使用apply()
將名稱集傳遞到您的函數中。
例如,假設您有一個函數,它只計算每一行的總和,這就是您將函數應用於列名對的方法
# Dummy data
df <- data.frame(A = runif(10, min = 0, max = 10),
B = runif(10, min = 0, max = 10),
C = runif(10, min = 0, max = 10),
X = runif(10, min = 10, max = 20),
Y = runif(10, min = -10, max = 0),
Z = runif(10, min = 100, max = 200))
head(df)
A B C X Y Z
1 1.4750598 8.362330 6.978016 12.21039 -8.5725828 115.7556
2 4.0354462 1.129128 7.344782 11.37921 -6.0101677 157.4816
3 0.4487861 5.458865 1.868728 16.07851 -4.4989306 143.0767
4 6.7159017 9.716656 3.389074 18.60543 -8.8977248 124.7074
5 9.7450640 7.766489 9.853184 10.30856 -5.2577736 138.8847
# Pairs of column names
names <- cbind(J = colnames(df[, 1:3]),
j = colnames(df[, 4:6]))
names
J j
[1,] "A" "X"
[2,] "B" "Y"
[3,] "C" "Z"
# Custom function
hapmap2gamete <- function(df) {
rowSums(df)
}
# 1 to apply over rows of data frame of names
results <- apply(names, 1, function(x) hapmap2gamete(df[, c(x)]))
# function results per row
results
[,1] [,2] [,3]
[1,] 117.2306 -0.2102531 19.18841
[2,] 161.5170 -4.8810398 18.72399
[3,] 143.5255 0.9599347 17.94724
[4,] 131.4233 0.8189311 21.99450
[5,] 148.6298 2.5087156 20.16175
[6,] 143.2299 -0.3145681 20.37046
[7,] 156.6609 -4.6445246 25.92664
[8,] 163.0996 4.0362794 19.30689
[9,] 133.7253 4.4901854 18.26631
[10,] 166.0438 2.2915776 21.57703
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.