我想比较同一列的2个连续行之间的值。 例: “col1.row1是否小于col1.row2” “col1.row2是否小于col1.row3” “col1.row3是否小于col1.row4” 我的计划是否在R ???“正确的方式”下“走出去”? 我对R Studio调试器不够强大,以便解决这个问题,所以我正在“发布”并发布... #---------------
# Here is some sample / mock data
row1 <- 1:3
row2 <- 1:3
row3 <- 2:4
row4 <- 2:4
dfSource <- data.frame(rbind(row1, row2, row3, row4))
dfSource
# My goal is to create "something" like this:
# Col1 | Result
# -------------
# row1 | FALSE
# row2 | TRUE
# row3 | FALSE
# row4 | FALSE
# My plan is to:
# 1 - create a data.frame to hold the results of row comparisons
dfResult <- data.frame()
# 2 - create a function to Insert the result of the "compare" function
insert <- function(rowA, rowB, retVal){
newRow <- data.frame(
Alpha = as.numeric(rowA) # This will be Column 1
, Beta = as.numeric(rowB) # This will be Column 2
, Result = retVal # This will be Column 3
, stringsAsFactors = FALSE)
dfResult <- rbind(dfResult, newRow) # <<<---------
dfResult
}
# 3 - create a function to compare the value of Col1.rowA to Col1.rowB in dfSource
compare <- function(rowA, rowB) {
retVal <- 0
if (rowB > rowA) { retVal <- 1 }
insert(rowA, rowB, retVal) # <<<-----------
}
# 4 - "for loop" through dfSource and pass the values to the "compare" function
rows <- nrow(dfSource)
f <- for(i in 1:rows) {
a <- dfSource[i,1] # [row,col]
b <- dfSource[i+1,1] # [row,col]
# Compare and Insert into dfResult
compare(a, b)
}
f
我的“逻辑”/“计划”好吗? 提前感谢任何事情...... Robert&lt; - as.Newb()
答案 0 :(得分:1)
鉴于您要比较每列中的2个连续行值,结果矩阵应始终比原始数据帧少1行。
实际上你可以使用以下一行。
res <- dfSource[1:(nrow(dfSource)-1), ] < dfSource[2:nrow(dfSource), ]
假设原始数据有N行。我们的想法是将数据分成两部分,一部分包括从第1行到第N-1行的数据;另一个包括从第2行到第N行的数据。然后由于两个子矩阵在逻辑运算方面是一致的,因此您可以轻松地进行比较。
结果矩阵如下:
X1 X2 X3
row1 FALSE FALSE FALSE
row2 TRUE TRUE TRUE
row3 FALSE FALSE FALSE
答案 1 :(得分:1)
这是否涵盖了您尝试做的事情?
a <- matrix(rnorm(30),nrow=10) # make some data
(diff(a)>0)
如果在数值表达式的第二行中使用结果(例如,添加0),则将根据需要使用值1和0.
答案 2 :(得分:0)
可能还有其他问题,但是您要循环遍历所有行,因此b <- dfSource[i+1,1]
行导致索引超出范围错误,因为您尝试访问的行不是&n {39}与i+1
一起存在。您也可以在一行中完成所需的一切:
dfResult <- (dfSource[-nrow(dfSource),] <= dfSource[-1,])