Как создать функцию цикла для получения результатов и поместить их в новые столбцы в R

#r

Вопрос:

У меня есть фрейм данных, как показано ниже,

  dat<- structure(list(Octagonplot = c(11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44, 51, 52, 53, 54, 61, 62, 63, 64, 71, 72, 73, 74, 81, 82, 83, 84, 91, 92, 93, 94, 101, 102, 103, 104, 111, 112, 113, 114, 121, 122, 123, 124, 11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44, 51, 52, 53, 54, 61, 62, 63, 64, 71, 72, 73, 74, 81, 82, 83, 84, 91, 92, 93, 94, 101, 102, 103, 104, 111, 112, 113, 114, 121, 122, 123, 124, 11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44, 51, 52, 53, 54, 61, 62, 63, 64, 71, 72, 73, 74, 81, 82, 83, 84, 91, 92, 93, 94, 101, 102, 103, 104, 111, 112, 113, 114, 121, 122, 123, 124), d13C = c(-27.822, -27.93, -27.927, -27.764, -28.081, -28.091, -28.553, -28.633, -27.996, -27.972, -27.664, -28.037, -28.211, -28.348, -28.5, -27.875, -28.331, -28.873, -28.609, -28.262, -27.569, -27.583, -27.305, -27.494, -27.484, -27.585, -27.368, -27.313, -27.894, -28.405, -27.296, -27.67, -27.175, -27.431, -27.382, -27.479, -28.059, -28.329, -28.285, -27.976, -27.564, -27.387, -27.958, -27.638, -28.087, -28.208, -28.513, -28.002, -27.977, -27.952, -27.647, -27.882, -29.181, -28.635, -29.131, -28.931, -28.42, -28.413, -27.993, -28.503, -29.54, -29.009, -29.197, -29.609, -29.346, -29.969, -29.798, -29.037, -27.854, -27.923, -27.976, -27.712, -27.769, -27.827, -27.735, -27.82, -28.345, -29.476, -28.387, -28.019, -27.307, -27.567, -27.429, -27.771, -28.044, -28.683, -28.786, -28.664, -27.653, -28.064, -28.036, -27.757, -28.323, -29.195, -28.828, -28.937, -27.9078297690006, -27.9386973277244, -27.7756066004902, -27.8411714524657, -28.7963592918008, -28.4522330354614, -28.8597856593141, -28.8113167816976, -28.1924531764532, NA, -27.824879800081, -28.2347160358722, -28.7498706023163, -28.7313297359698, -28.7365680482049, -28.7272468735994, -28.803582483867, -29.4363702389094, NA, -28.7054768643306, -27.7481689930581, -27.7535107262537, -27.6555760218728, NA, -27.6272638860929, -27.7069166950818, -27.5782961448598, -27.5234468773432, -28.1124586856048, -29.0179480728715, -27.8824806843723, -27.8693344400536, -27.2278831040908, -27.5051927317272, -27.4090338924322,-27.6583036975383,-28.0521215748621, -28.5076100126232, -28.5288005348874, -28.3745035897644, -27.6136332691194, NA, -28.0041637896659, -27.6963035708696, -28.1989533738283, -28.8230228029304, -28.7207578899079, -28.4489097046946), midpoint = c(2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5,2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5,2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7,8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7,8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7,8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2)), row.names = c(NA, -144L), class = c("tbl_df", "tbl","data.frame"))
 

Я хочу найти линейную зависимость внутри каждого восьмиугольника, а затем вычислить значения d13C, когда значение средней точки==5, используя их линейную зависимость. И создайте новый фрейм данных для выходных данных, соответствующих номеру восьмиугольника. Вот мой код для Octagonplot ‘124’, но я хочу, как зациклить их все с 11,12,13,14,21,22,…. 123,124.

 target1 <- c("124")
C124<- filter(dat, Octagonplot%in% target1) 

mod124<- lm(C124$d13C~C124$midpoint)
summary(mod124)

a <- coef(summary(mod124))[2]
b <- coef(summary(mod124))[1]

y124<- a*5 b
y124 
 

Надеюсь, кто-нибудь сможет помочь.

Ответ №1:

Возможно, это то, что вы ищете. Вы проиграете d13C , и midpoint...5 какие из них были в вашем примере вывода, но мне неясно, как вы их выбираете. Кроме того, midpoint...5 никогда не бывает равно 5, поэтому я предположил, что это фильтр, который вы уже применили и использовали все значения средней точки.

 dat <- structure(list(Octagonplot = c(11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44, 51, 52, 53, 54, 61, 62, 63, 64, 71, 72, 73, 74, 81, 82, 83, 84, 91, 92, 93, 94, 101, 102, 103, 104, 111, 112, 113, 114, 121, 122, 123, 124, 11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44, 51, 52, 53, 54, 61, 62, 63, 64, 71, 72, 73, 74, 81, 82, 83, 84, 91, 92, 93, 94, 101, 102, 103, 104, 111, 112, 113, 114, 121, 122, 123, 124, 11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44, 51, 52, 53, 54, 61, 62, 63, 64, 71, 72, 73, 74, 81, 82, 83, 84, 91, 92, 93, 94, 101, 102, 103, 104, 111, 112, 113, 114, 121, 122, 123, 124), d13C = c(-27.822, -27.93, -27.927, -27.764, -28.081, -28.091, -28.553, -28.633, -27.996, -27.972, -27.664, -28.037, -28.211, -28.348, -28.5, -27.875, -28.331, -28.873, -28.609, -28.262, -27.569, -27.583, -27.305, -27.494, -27.484, -27.585, -27.368, -27.313, -27.894, -28.405, -27.296, -27.67, -27.175, -27.431, -27.382, -27.479, -28.059, -28.329, -28.285, -27.976, -27.564, -27.387, -27.958, -27.638, -28.087, -28.208, -28.513, -28.002, -27.977, -27.952, -27.647, -27.882, -29.181, -28.635, -29.131, -28.931, -28.42, -28.413, -27.993, -28.503, -29.54, -29.009, -29.197, -29.609, -29.346, -29.969, -29.798, -29.037, -27.854, -27.923, -27.976, -27.712, -27.769, -27.827, -27.735, -27.82, -28.345, -29.476, -28.387, -28.019, -27.307, -27.567, -27.429, -27.771, -28.044, -28.683, -28.786, -28.664, -27.653, -28.064, -28.036, -27.757, -28.323, -29.195, -28.828, -28.937, -27.9078297690006, -27.9386973277244, -27.7756066004902, -27.8411714524657, -28.7963592918008, -28.4522330354614, -28.8597856593141, -28.8113167816976, -28.1924531764532, NA, -27.824879800081, -28.2347160358722, -28.7498706023163, -28.7313297359698, -28.7365680482049, -28.7272468735994, -28.803582483867, -29.4363702389094, NA, -28.7054768643306, -27.7481689930581, -27.7535107262537, -27.6555760218728, NA, -27.6272638860929, -27.7069166950818, -27.5782961448598, -27.5234468773432, -28.1124586856048, -29.0179480728715, -27.8824806843723, -27.8693344400536, -27.2278831040908, -27.5051927317272, -27.4090338924322,-27.6583036975383,-28.0521215748621, -28.5076100126232, -28.5288005348874, -28.3745035897644, -27.6136332691194, NA, -28.0041637896659, -27.6963035708696, -28.1989533738283, -28.8230228029304, -28.7207578899079, -28.4489097046946), midpoint...5 = c(2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5,2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5,2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7,8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7,8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7,8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 8.7, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2, 6.2)), row.names = c(NA, -144L), class = c("tbl_df", "tbl","data.frame"))

get_y <- function(df) {
  mod<- lm(df$d13C ~ df$midpoint)
  a <- coef(summary(mod))[2]
  b <- coef(summary(mod))[1]
  y <- a * 5   b
  out <- data.frame(Octagonplot = unique(df$Octagonplot), y = y)
  out
}

result <- lapply(unique(dat$Octagonplot), function(Oct)
  get_y(dat[dat$Octagonplot == Oct, ]))

result <- do.call(rbind.data.frame, result)

head(result)
#   Octagonplot         y
# 1          11 -27.88239
# 2          12 -27.93747
# 3          13 -27.81907
# 4          14 -27.81372
# 5          21 -28.54322
# 6          22 -28.32195