R-如何找到每列的每一连续行之间的差异

R-如何找到每列的每一连续行之间的差异,r,R,我在一个数据帧中有许多列,上面是其中的一小部分,我想找出每列的每一个连续行之间的差异。例如,第3-2行、第4-3行、第5-4行等中每列的值 我使用了以下代码: Date FXDL.AED.USD FXDL.ALL.USD FXDL.AMD.USD FXDL.ANG.USD 03/01/2005 3.6726 92.1 484 1.779999971 04/01/2005 3.6726 92.1 487 1.779999971 05/01/2

我在一个数据帧中有许多列,上面是其中的一小部分,我想找出每列的每一个连续行之间的差异。例如,第3-2行、第4-3行、第5-4行等中每列的值

我使用了以下代码:

Date    FXDL.AED.USD    FXDL.ALL.USD    FXDL.AMD.USD    FXDL.ANG.USD  
03/01/2005  3.6726  92.1    484 1.779999971  
04/01/2005  3.6726  92.1    487 1.779999971  
05/01/2005  3.6725  94.5    490.5   1.779999971 
06/01/2005  3.6726  95.1    490.5   1.779999971 
07/01/2005  3.6725  95.3    493.5   1.779999971 
08/01/2005  NA  NA  NA  NA  
09/01/2005  NA  NA  NA  NA  
10/01/2005  3.6726  96.9    497.5   1.779999971  
11/01/2005  3.6725  97.2    502.5   1.779999971  

我们可以在
tidyverse

structure(list(Weekday = c(1, 2, 3, 4, 5), Date = structure(c(1104710400, 
1104796800, 1104883200, 1104969600, 1105056000), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), FXDL.AED.USD = c("3.6726000000000001", 
"3.6726000000000001", "3.6724999999999999", "3.6726000000000001", 
"3.6724999999999999"), FXDL.ALL.USD = c("92.1", "92.1", "94.5", 
"95.1", "95.3"), FXDL.AMD.USD = c("484", "487", "490.5", "490.5", 
"493.5")), .Names = c("Weekday", "Date", "FXDL.AED.USD", "FXDL.ALL.USD", 
"FXDL.AMD.USD"), row.names = c(NA, 5L), class = c("tbl_df", "tbl", 
"data.frame"))

我们可以在
tidyverse

structure(list(Weekday = c(1, 2, 3, 4, 5), Date = structure(c(1104710400, 
1104796800, 1104883200, 1104969600, 1105056000), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), FXDL.AED.USD = c("3.6726000000000001", 
"3.6726000000000001", "3.6724999999999999", "3.6726000000000001", 
"3.6724999999999999"), FXDL.ALL.USD = c("92.1", "92.1", "94.5", 
"95.1", "95.3"), FXDL.AMD.USD = c("484", "487", "490.5", "490.5", 
"493.5")), .Names = c("Weekday", "Date", "FXDL.AED.USD", "FXDL.ALL.USD", 
"FXDL.AMD.USD"), row.names = c(NA, 5L), class = c("tbl_df", "tbl", 
"data.frame"))

sappy(x[,sappy(x,is.numeric)],diff)
。前面的代码将对数据框
x
中的每个数字列应用
diff
函数(两个值之间的差值)。谢谢!然而,这似乎只适用于第一列。@isuckatcoding;eipi10的代码应该可以工作,所以您可以在问题中添加一个小的数据示例:您可以通过将
dput(x[1:5,1:5])
的结果添加到您的问题中来实现这一点。谢谢(ps我想你可以通过显式转换为矩阵来避免
sapply
ineipi的代码…
diff(as.matrix(x[,sapply(x,is.numeric)])
)hi@user20650我用dput函数编辑了我的问题。我试着把它转换成一个矩阵,但它只对一列做了一次…谢谢。好的,看看
str(x)
,你会发现看起来像数字的值实际上是字符(为什么
sapply(x,is.numeric)
只找到一个数字列)。您可以通过.numeric将其转换为numeric,但实际上最好是尝试在代码的前面找到发生这种情况的地方,并尝试在那里修复它
sapply(x[,sapply(x,is.numeric)],diff)
。前面的代码将对数据框
x
中的每个数字列应用
diff
函数(两个值之间的差值)。谢谢!然而,这似乎只适用于第一列。@isuckatcoding;eipi10的代码应该可以工作,所以您可以在问题中添加一个小的数据示例:您可以通过将
dput(x[1:5,1:5])
的结果添加到您的问题中来实现这一点。谢谢(ps我想你可以通过显式转换为矩阵来避免
sapply
ineipi的代码…
diff(as.matrix(x[,sapply(x,is.numeric)])
)hi@user20650我用dput函数编辑了我的问题。我试着把它转换成一个矩阵,但它只对一列做了一次…谢谢。好的,看看
str(x)
,你会发现看起来像数字的值实际上是字符(为什么
sapply(x,is.numeric)
只找到一个数字列)。您可以通过
as.numeric
将其转换为数值,但实际上最好是尝试在代码的前面找到发生这种情况的地方,并尝试在那里进行修复
library(tidyverse)
df1 %>% 
    mutate_each(funs(c(NA, diff(as.numeric(.)))), 3:5)