1

我正在尝试以一种非常具体的方式为我的研究组织一个数据集,但是我是 R 的新手,我真的很挣扎,任何帮助都将不胜感激。

我试图在每第三列(从第一列开始)获取单元格的值并将其乘以它旁边的列,但前提是所述单元格中有负值​​。在此之后,我想将结果汇总在一起并将其存储在外部电子表格的新列中。

到目前为止,我编写的代码如下:

 NegTotal = NULL 
    p = NULL
    for (i in 1:nrow(Datafile)) 
      {for (j in 1:ncol(Datafile)) 
           {if ((j %% 3 == 0) && (Datafile [i,j] < 0)) {
               p <- (datafile[i,j] * datafile[i,j+1])
               NegTotal <- sum(p) }
           else { }
          }
       } 
   for (l in seq(along = NegTotal)) {
      dim(newColumn)
      AsNewData.DataColumn("datafile", GetType(System.String))
      NewColumn.DefaultValue = "NegTotal"
      table.Columns.Add(newColumn)
    }

我知道这段代码可能是完全错误的,这是我第一次使用 R,而且我一般不太精通计算机编程。

当前数据排列如下:

df <- data.frame(F1 = c( 1, -2, -1), E1 = c(1, 1, 0), Y1 = c(0, 0, 1),
                 F2 = c(-1,  2, -1), E2 = c(1, 1, 1), Y2 = c(0, 0, 1), 
                 F3 = c(-2, -2, -1), E3 = c(1, 1, 1), Y3 = c(1, 1, 0))

#   F1 E1 Y1 F2 E2 Y2 F3 E3 Y3
# 1  1  1  0 -1  1  0 -2  1  1
# 2 -2  1  0  2  1  0 -2  1  1
# 3 -1  0  1 -1  1  1 -1  1  0

期望的输出:

#   F1 E1 Y1 F2 E2 Y2 F3 E3 Y3 NegTotal
# 1  1  1  0 -1  1  0 -2  1  1       -3
# 2 -2  1  0  2  1  0 -2  1  1       -4
# 3 -1  0  1 -1  1  1 -1  1  0       -2

所以如果 x = Fy * Ey; NegTotal = x1 + x2 + x3,仅当 F$y < 0 时。

我希望一切都有意义!

4

2 回答 2

1

以下是我将如何使用dplyrand来解决这个问题tidyr

library(dplyr)
library(tidyr)

# Add a respondent column (i.e. row number)
df$respondent <- 1:nrow(df)

df %>%
  gather(key, value, -respondent) %>%
  separate(key, c("letter", "letter_sub"), sep = 1) %>%
  spread(letter, value) %>% 
  mutate(Neg = ifelse(F < 0, E * F, NA)) %>%
  group_by(respondent) %>%
  summarise(NegTotal = sum(Neg, na.rm = TRUE))

# Source: local data frame [3 x 2]
# 
#   respondent NegTotal
#        (int)    (dbl)
# 1          1       -3
# 2          2       -4
# 3          3       -2

为了了解发生了什么,我将分段运行管道。例如,看一下前几个函数的结果:

df %>%
  gather(key, value, -respondent) %>%
  separate(key, c("letter", "letter_sub"), sep = 1) %>%
  spread(letter, value)

#   respondent letter_sub E  F Y
# 1          1          1 1  1 0
# 2          1          2 1 -1 0
# 3          1          3 1 -2 1
# 4          2          1 1 -2 0
# 5          2          2 1  2 0
# 6          2          3 1 -2 1
# 7          3          1 0 -1 1
# 8          3          2 1 -1 1
# 9          3          3 1 -1 0

以这种形式获取数据,可以更轻松地执行摘要任务。

于 2015-11-10T15:36:35.207 回答
0

此代码将为您提供所需的输出。但是,如果您的实际数据集比您给出的示例更复杂,您可能需要一个更优雅的解决方案。

df$NegTotal<- (pmin(0,df$F1) * df$E1) + (pmin(0,df$F2) * df$E2) + (pmin(0,df$F3) * df$E3)
于 2015-11-10T14:17:49.947 回答