【问题标题】:Create a new column following complex condition根据复杂条件创建新列
【发布时间】:2017-06-07 16:23:55
【问题描述】:

这里是情况的完整解释。我的代码似乎对理解我想要的东西不是很有帮助,所以我尝试用文字来描述它:

我让人们进行 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
  }
}

【问题讨论】:

  • 您需要提供一个可重现的示例dput(),并且还需要一个所需输出的示例。
  • 你有矩阵吗?另一种情况是您可以以不同的方式处理子集,即data_A08$Value[data_A08&amp; &amp; 令人困惑
  • bid 正在遍历 dat_A08 的列,我认为 OP 想要遍历行。至于与号的混乱我也不明白。
  • 原则上(并且可能在大多数情况下)某个回合中的某个人的值可能低于其他人但高于另一个人,因此不清楚如何给这些 -1 0 +1。在你的循环中,你似乎测试它是否是最大值,然后测试它是否低于最大值,那么我不确定第三个选项应该是什么:)
  • 哦,是的,我想遍历行,我是在遍历列吗?和号乱七八糟的是在同一组中找到同一轮中的玩家。我取了 max() 值,因为它在整个回合中都是相同的,但我想不出一种更简单的方法来从我得到的(可能)向量中获取一个值

标签: r dataframe boolean


【解决方案1】:

请告诉我这是否是您想要的。因为我不确定我是否理解整个问题(检查结果的最后 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

【讨论】:

  • 对不起,我真的不明白你在那里做了什么:/ 我将编辑我的问题,以便更清楚我最终想要什么。不过还是谢谢!
猜你喜欢
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 2016-08-16
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多