我有一个数据框,其中包含一个数据框的列的每个单元格内的列表。例如,这里是一个测试数据框。
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帖子,我也很感谢提出问题时的任何元反馈!
答案 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),那么这会非常方便,甚至最终会很直观。