[英]How to loop through a variable list and add values to an output dataframe in R?
[英]How to run a for loop through a list in a dataframe in R
我有一個數據框,其中包含一個數據框的列的每個單元格內的列表。 例如,這是一個測試數據幀。
df <- data.frame(id=1:2)
df$month <- list(c("1","2","3"), c("3","5","7"))
df
我想連續計算每個列表中的均值差,並將結果存儲為新變量,例如MeanDiff。 例如(1,2,3)的平均差為1(((2-1)+(3-2))/ 2)。
我的外部for循環將是
for (i in 1: nrow(df)){
}
但是,我不知道如何在必須運行函數的行中遍歷列表的每個元素,這看起來像
Diff = []
Diff[i] = i+1 - i
MeanDiff[i] = Diff/length(Diff)
任何幫助,將不勝感激! 另外,這是我的第一篇StackOverflow帖子,我也很感謝提出問題時的任何元反饋!
您可以使用lapply
> lapply(df$month, function(x)
{tmp <- as.numeric(x) # this converts character to numeric
tmp <- sum(diff(tmp))/(length(tmp)-1) # performs calculations
tmp}) # returns output
[[1]]
[1] 1
[[2]]
[1] 2
如果希望輸出是向量而不是列表,則使用sapply
。
這是兩個解決方案:
df$diff <- lapply(df$month, function(a) sum(diff(as.numeric(a)))/2)
df
# id month diff
# 1 1 1, 2, 3 1
# 2 2 3, 5, 7 2
一個值得一提的問題是,盡管它看起來像一個常規的列,但它並不完全符合您的期望:
df$diff[1]
# [[1]]
# [1] 1
那是一個單個元素的list
,您可能希望在其中有一個標量(或者在R的情況下為長度為1的向量)。 一種替代方法(如JilberUrbina所建議的)是在期望結果為長度1的情況下使用sapply
:
df$diff2 <- sapply(df$month, function(a) sum(diff(as.numeric(a)))/2)
df$diff2[1]
# [1] 1
如果您另外使用的是tidyverse
工具集(很多人推薦),請嘗試以下操作:
library(dplyr)
library(purrr)
df %>%
mutate(
diff = map(month, ~ sum(diff(as.numeric(.)))/2)
)
# id month diff
# 1 1 1, 2, 3 1
# 2 2 3, 5, 7 2
如果你把它存儲在tidyverse
的一個默認tibble
,它會出現這樣的:
tbl_df(df) %>%
mutate(
diff = map(month, ~ sum(diff(as.numeric(.)))/2)
)
# # A tibble: 2 x 3
# id month diff
# <int> <list> <list>
# 1 1 <chr [3]> <dbl [1]>
# 2 2 <chr [3]> <dbl [1]>
盡管實際上是同一回事。 如果您打算在列中重復存儲列表或其他復雜的事物(例如, lm
模型, predict
離子),那么這將非常方便,甚至最終會很直觀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.