簡體   English   中英

如何在R中的數據幀中的列表中運行for循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM