R:在复杂条件下创建新列

时间:2017-06-07 16:23:55

标签: r dataframe boolean

以下是对情况的完整解释。我的代码似乎对理解我想要的内容没有多大帮助,所以我试着用文字描述它:

我让人们进行了5轮拍卖,在那里他们与另一个参与者配对,并且他们每个人都有一定的(随机的,不同的每一轮)“价值”。他们每个人都可以根据需要设置多个出价(“金额”)。出价的时间也得到了保存,以及出价成功的信息。我最终想要知道的是,具有最高价值的人是否赢得了拍卖(=获得最高的成功出价[并且是抽签时的第一个]。

为了做到这一点(以及练习)我首先要创建一个列,检查组中是否有相同的值(“0”)。一路上我想我还可以检查玩家是否有两个更高(“1”)或更低(“-1”)的值。为此,我想循环遍历行,检查条件并将相应的值写入新列。

下面:旧解释

我正在尝试创建一个新列,如果同一轮中的某个人在“值”列中具有更低,相同或更高的值,则应该取值1,0或-1。这里的其他问题似乎只处理非常简单的情况(或者我没有看到连接,我刚开始这个) 我尝试的是:

dat_A08["ValueIsHigher"] <- NA
for (bid in dat_A08){
  if (bid$Value == max(dat_A08[dat_A08&Round == bid&Round & dat_A08&GroupID == bid&GroupID,]$Value)){
    bid&ValueIsHigher = 0
  } else if (bid$Value < max(dat_A08[dat_A08&Round == bid&Round & dat_A08&GroupID == bid&GroupID,]$Value)) {
    bid&ValueIsHigher = -1
  } else {
    bid&ValueIsHigher = 1
  }
}

我几乎定义了一个新列,然后尝试根据条件为其写入新值。但我收到了错误

  

错误:$运算符对原子矢量无效

如何访问此值?

提前致谢!

[编辑:添加数据,希望可执行脚本]

数据文件如下所示:

Mode;Round;Value;Amount;At_time;In_stage;Success;participant_code;GroupID;BidToValue;GebAlsHoechstb
2;5;41;41;264.537.857.723.236;1;1;p10;1;1;
2;5;37;37;264.558.881.688.118;1;1;p4;1;1;
2;5;37;38;265.961.394.166.946;2;1;p4;1;2;
2;5;40;60;2.589.505.194.664;2;1;p11;2;2;
2;5;40;40;252.504.601.478.577;1;1;p11;2;1;
2;5;45;45;257.754.272.294.044;1;1;p3;2;1;
2;5;40;61;266.139.678.239.822;2;1;p11;2;2;

整个脚本可以像这样工作:

dat_A08 = read.csv("csv_A08.csv", header = TRUE, sep = ";")
dat_A08 <- dat_A08[,!(names(dat_A08) %in% c("GebAlsHoechstb"))]

dat_A08$At_time <- as.numeric(as.character(gsub("\\.","",dat_A08$At_time)))

dat_A08["ValueIsHigher"] <- NA
for (bid in dat_A08){
  if (bid$Value == max(dat_A08[dat_A08&Round == bid&Round & dat_A08&GroupID == bid&GroupID,]$Value)){
    bid&ValueIsHigher = 0
  } else if (bid$Value < max(dat_A08[dat_A08&Round == bid&Round & dat_A08&GroupID == bid&GroupID,]$Value)) {
    bid&ValueIsHigher = -1
  } else {
    bid&ValueIsHigher = 1
  }
}

1 个答案:

答案 0 :(得分:0)

请告诉我它是否符合你的要求。因为我不确定我是否理解整个问题(检查结果的最后3个字母)。

如果它是你想要的,我可以更深入地解释

dat_A08 <- read.table(text ="Mode;Round;Value;Amount;At_time;In_stage;Success;participant_code;GroupID;BidToValue;GebAlsHoechstb
2;5;41;41;264.537.857.723.236;1;1;p10;1;1;
2;5;37;37;264.558.881.688.118;1;1;p4;1;1;
2;5;37;38;265.961.394.166.946;2;1;p4;1;2;
2;5;40;60;2.589.505.194.664;2;1;p11;2;2;
2;5;40;40;252.504.601.478.577;1;1;p11;2;1;
2;5;45;45;257.754.272.294.044;1;1;p3;2;1;
2;5;40;61;266.139.678.239.822;2;1;p11;2;2;",sep=";",header=TRUE)

max_values <- setNames(aggregate(Value ~ Round,dat_A08,max)   ,c("Round","max_value"))
min_values <- setNames(aggregate(Value ~ Round,dat_A08,min)   ,c("Round","min_value"))
n_values   <- as.data.frame(table(dat_A08[,c("Value","Round")]))
dat_A08b <- merge(dat_A08 ,min_values)
dat_A08b <- merge(dat_A08b,max_values)
dat_A08b <- merge(dat_A08b,n_values)
dat_A08b$is_max   <- dat_A08b$Value == dat_A08b$max_value
dat_A08b$is_min   <- dat_A08b$Value == dat_A08b$min_value
dat_A08b$somebody_has_same_value <- dat_A08b$Freq > 1

# Round Value Mode Amount             At_time In_stage Success participant_code GroupID BidToValue GebAlsHoechstb min_value max_value Freq is_max is_min
# 1     5    37    2     37 264.558.881.688.118        1       1               p4       1          1             NA        37        45    2  FALSE   TRUE
# 2     5    37    2     38 265.961.394.166.946        2       1               p4       1          2             NA        37        45    2  FALSE   TRUE
# 3     5    40    2     60   2.589.505.194.664        2       1              p11       2          2             NA        37        45    3  FALSE  FALSE
# 4     5    40    2     40 252.504.601.478.577        1       1              p11       2          1             NA        37        45    3  FALSE  FALSE
# 5     5    40    2     61 266.139.678.239.822        2       1              p11       2          2             NA        37        45    3  FALSE  FALSE
# 6     5    41    2     41 264.537.857.723.236        1       1              p10       1          1             NA        37        45    1  FALSE  FALSE
# 7     5    45    2     45 257.754.272.294.044        1       1               p3       2          1             NA        37        45    1   TRUE  FALSE
# somebody_has_same_value
# 1                    TRUE
# 2                    TRUE
# 3                    TRUE
# 4                    TRUE
# 5                    TRUE
# 6                   FALSE
# 7                   FALSE