请查看我的应用程序逻辑 - R Newb

时间:2014-09-30 00:29:55

标签: r

我想比较同一列的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()

3 个答案:

答案 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,])