向数据框中添加一个分组列。

3
我有一个数据框 df,如下所示。
      V1 V2
1  13219  0
2   6358  1
3   4384  2
4   3359  3
5   2820  4
6   2466  5
7   2144  6
8   1941  7
9   1778  8
10  1550  9

我希望添加一个“group”列,该列将对应于不同的df$V2值。
At df$V2 = 0 group will be A
At df$V2 >0 <=5 group will be B
At df$V2 >= 6 group will be C

这句话的英译中文为:“想法是获得类似于此的东西:”(保留HTML标签,不做解释)。
      V1 V2 Grp
1  13219  0 A
2   6358  1 B
3   4384  2 B
4   3359  3 B
5   2820  4 B
6   2466  5 B
7   2144  6 C
8   1941  7 C
9   1778  8 C
10  1550  9 C

一开始看起来很简单,但是在谷歌上搜索并没有太大的帮助。非常感谢您的建议。

2个回答

4
您可以使用cutfindInterval函数。
df$Grp <- with(df, LETTERS[1:3][cut(V2, breaks=c(-Inf,0, 5, Inf),
            labels=FALSE)])

df$Grp <-  with(df, LETTERS[1:3][findInterval(V2, c(-Inf,0, 5,Inf)+1)])

df
#      V1 V2 Grp
#1  13219  0   A
#2   6358  1   B
#3   4384  2   B
#4   3359  3   B
#5   2820  4   B
#6   2466  5   B
#7   2144  6   C
#8   1941  7   C
#9   1778  8   C
#10  1550  9   C

或者

 with(df, LETTERS[c(2,1,3)][1+(V2==0) + 2*(V2 >=6)])
 #[1] "A" "B" "B" "B" "B" "B" "C" "C" "C" "C"

我自己永远找不到这个,谢谢。 - Benoit B.
记录一下,我使用了以下代码: labels=c("否","低","中","高") df$Grp <- with(df, labels[cut(V2, breaks=c(-Inf,0, 5, 50, Inf), labels=FALSE)]) - Benoit B.
在 findinterval 中,+1 是什么意思? - Benoit B.
@BenoitB。这是因为?findInterval选项上的一些差异。 - akrun

3
使用索引,这可以很容易地实现:
df$group <- NA
df$group[df$V2 == 0] <- "A"
df$group[df$V2 > 0]  <- "B"
df$group[df$V2 >= 6] <- "C"

注意,第三个和第四个语句必须按照顺序运行。否则,如果您不想在“B”赋值之后再运行“C”赋值,您需要更彻底地定义“B”赋值的索引:

df$group[df$V2 > 0 & df$V2 < 6] <- "B"

结果

      V1 V2 group
1  13219  0     A
2   6358  1     B
3   4384  2     B
4   3359  3     B
5   2820  4     B
6   2466  5     B
7   2144  6     C
8   1941  7     C
9   1778  8     C
10  1550  9     C

数据

df <- read.csv(text="V1,V2
13219,0
6358,1
4384,2
3359,3
2820,4
2466,5
2144,6
1941,7
1778,8
1550,9")

3
好的,不是所有人都使用大型数据库。对于这样一个简单的问题,我认为这是一个完全可行的选择。关于容易出现错误,我不明白你的观点。犯错误有很多种方式,无论我们选择哪种方法,都需要付出足够的注意力。 - Jason V
2
容易出错是指你自己正确提到的(我引用):“请注意,第三个和第四个语句必须按照这个顺序运行”。 - David Arenburg
2
@JasonV,我没看到你是回答者。顺便说一下,我喜欢你们互相点赞的方式,但这并不能证明你们是正确的。那另一行代码更糟糕,它在一行中调用了 df 三次,并迫使你记住逻辑。如果有20个不同的条件会发生什么?我很想看看你如何编写这些代码。 - David Arenburg
2
@JasonV,它怎么比“cut”更易读?在“cut”或“findInterval”方法中调用20个条件都不会改变任何东西。R有特殊的方法来处理这些问题,手动编写所有条件只是从上述原因来看是错误的。 - David Arenburg
2
@docendodiscimus,我并没有说这个答案是完全错误的。我只是认为,对于20个条件来说,手动编写所有条件是不正确的。 - David Arenburg
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接