如何在R中的数据帧中的列表中运行for循环

时间:2018-09-06 15:43:09

标签: r for-loop

我有一个数据框,其中包含一个数据框的列的每个单元格内的列表。例如,这里是一个测试数据框。

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帖子,我也很感谢提出问题时的任何元反馈!

2 个答案:

答案 0 :(得分:0)

您可以使用BUSINESS_UNIT VOUCHER_ID PYMNT_CNT PYMNT_ID PYMNT_TYPE PAID_AMT PYMNT_GROSS_AMT DUE_DT 50000 26130 1 121315 R 969.3 969.3 6/29/2018 50000 26131 1 R 0 0 6/30/2018 50000 26132 1 R 0 1000 6/30/2010 50000 26133 1 121312 R 100 100 6/28/2018 50000 26134 1 121309 R 100 100 6/28/2018 50000 26135 1 121308 R 100 100 8/2/2018 50000 26136 1 121314 R 96.93 96.93 8/24/2018 50000 26137 1 121316 R 969.3 969.3 9/4/2018

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

答案 1 :(得分:0)

以下是两种解决方案:

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 ions),那么这会非常方便,甚至最终会很直观。