根据现有列中的值将值分配给新列

时间:2018-07-15 17:44:28

标签: r

我有以下数据框:

df <- as.data.frame(c(sort(rep(1:12, 4))))
colnames(df) <- c("A")
df

我希望创建一个新列('B'),将1分配给df$A == 1:3的行,将2分配给df$A == 4:6的行,将3分配给df$A == 7:9的行,等等。结果应如下所示:

df <- as.data.frame(c(sort(rep(1:12, 4))))
colnames(df) <- c("A")
df$B <- c(sort(rep(1:4, 12)))
df

这很重要:我不知道df$A列中有多少个值等于1、2、3等。此外,df$A == 1和{{ 1}}不一定相等。

我知道我可以通过执行以下操作来解决此问题:

df$A == 2

还有什么其他方法可以解决此问题?谢谢!

2 个答案:

答案 0 :(得分:0)

  

还有什么其他方法可以解决此问题?谢谢!

您可以使用%/%功能

df <- data.frame(A = 1:12)
str(df)
#R 'data.frame':    12 obs. of  1 variable:
#R  $ A: int  1 2 3 4 5 6 7 8 9 10 ...

df$B <- 1L + (df$A - 1L) %/% 3L
str(df)
#R 'data.frame':    12 obs. of  2 variables:
#R   $ A: int  1 2 3 4 5 6 7 8 9 10 ...
#R   $ B: int  1 1 1 2 2 2 3 3 3 4 ...

请确保使用整数,因为您可以在help("%/%")

中找到以下内容
  

x %/% y可用于非整数y,例如1 %/% 0.2,但结果容易出现表示错误,因此可能与平台有关。由于0.2的IEC 60059表示形式是比0.2稍大的二进制分数,因此1 %/% 0.2的答案应该是4,但是大多数平台都给出了5。 / p>

答案 1 :(得分:0)

如果from bottle import route, request, response, template @route('/forum') def display_forum(): forum_id = request.query.id page = request.query.page or '1' return template('Forum ID: {{id}} (page {{page}})', id=forum_id, page=page) 打算将解决方案用作OP链的一部分,而不是使用dplyr,则%%%/%可以是以下另一种选择:

tidyr::fill
相关问题