【问题标题】:create a new column with multiple categories using two columns when they satisfy certain conditions using R当使用 R 满足某些条件时,使用两列创建具有多个类别的新列
【发布时间】:2013-02-25 10:48:57
【问题描述】:

我有一个数据集“X”(值从 0 到 80)和“Y”(值从 0 到 80)。我想创建一个新列“表”。我有 36 张桌子:每组 6 张……它们应该按照以下方式分组:

  • 表 1-6:ALL Y 11-20... 表 7-12:Y 21-30, 表 13-18:Y 31 -40,表 19-24:Y 41-50,表 25-30:Y 51-60,表 31-36:Y 61-70
  • 表 1:X 21-30 和表 7、13、19、25、31
  • 表 2:X 31-40 和表 8、14、20、26、32
  • 表 3:X 41-50 和表 9、15、21、27、33
  • 表 4:X 51-60 和表 10、16、22、28、34
  • 表 5:X 61-70 和表 11、17、23、29、35
  • 表 6:X 71-80 和表 12、18、24、30、36

最终结果:

X   Y   Table
45  13    3
66  59    29
21  70    31
17  66    NA (there is no table for X lower than 21)

我应该使用 If Else 函数将“X”和“Y”中的数据分组到我的新“表”中,范围从 1 到 36 还是其他?任何帮助将不胜感激!谢谢!

头部(数据)

    value avg.temp  X  Y
1      0     6.69   45 13
2      0     6.01   48 14
3      0     7.35   39 15
4      0     5.86   45 15
5      0     6.43   42 16
6      0     5.68   48 16

【问题讨论】:

  • 恐怕我不明白你的分组。似乎有两组不同的表,一组用于 X,一组用于 Y。
  • @juba,我想您必须将单词 table 替换为 columns。我假设最终结果不仅仅是 3 行。
  • 表1:Y11-20、X21-30和表2:Y11-20、X31-40和表3:Y11-20和X41-50等......表7: Y21-30、X21-30和表8:Y21-30、X31-40和表9:Y21-20、X41-50等...以表35结尾:Y61-70、X61-70和表36 : Y61-70, X71-80....现在好点了吗??要满足的 2 个条件是 X 和 Y...,并且这些表是 6 个一组的...表 1-6、7-12..都具有相同的 Y...表 1、7、13、19, 25,31 都有相同的 X...
  • 你想要这个 X,Y,Table 的巨大 data.frame 吗?
  • 再一次,您的茶几是否有按顺序排列的值,或者您只需要一个样本?您的问题目前尚不清楚。

标签: r conditional-statements multiple-columns


【解决方案1】:

我认为你可以使用这样的东西。如果您的数据框称为df

df$Table <- NA
df$Table[df$X>=21 & df$X<=30 & df$Y>=11 & df$Y<=20] <- 1
df$Table[df$X>=31 & df$X<=40 & df$Y>=11 & df$Y<=20] <- 2
...

【讨论】:

  • 是的,这行得通...我知道这将是一种非常基本的方法,但是 R 能够更智能地做到这一点吗?因为如果我使用上面的方法,我将不得不写32行......
  • @Bala 好吧,我认为您应该尽可能巧妙地组织和编码您的条件。但也许你无法用少于 32 行来表达你的 32 个条件。
  • @Bala 不客气。别忘了,如果您认为它解决了您的问题,您可以接受带有绿色标记的答案。
【解决方案2】:

使用数学和索引:

# demo data
x <- data.frame(X = c(45,66,21,17,0,1,21,80,45),Y = c(13,59,70,66,80,11,0,1,27))

# if each GROUP of Y tables was numbered 1-6, aka indexing
x$ytableindex <- ((x$Y-1) - (x$Y-1) %% 10) / 10

# NA if too low
x$ytableindex[x$ytableindex < 1] <- NA

# find lowest table based on Y index
x$ytable <- (0:5*6+1)[x$ytableindex]

# find difference from lowest Y table to arrive at correct table using X
x$xdiff <- floor((x$X - 1) / 10 - 2)

# NA if too low
x$xdiff[x$xdiff < 0] <- NA

# use difference to calculate the correct table, NA's stay NA
x$Table <- x$ytable + x$xdiff

【讨论】:

    猜你喜欢
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 2019-11-18
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 2016-11-25
    相关资源
    最近更新 更多