【问题标题】:Add new column to dataframe depending on upper limit [duplicate]根据上限将新列添加到数据框[重复]
【发布时间】:2020-09-23 14:31:56
【问题描述】:

我有一个数据集,我想在其中一个 num_values 添加来自另一个数据帧的新值。

这是一个例子,创建一些 df1

First.Name <- c("John", "Edgar", "Walt", "Jane")
Second.Name <- c("Doe", "Poe", "Whitman", "Austen")
num_value <- runif(4,0,1.2)
df1 <- data.frame(First.Name, Second.Name, num_value)

有这个输出

 First.Name Second.Name  num_value
1       John         Doe 0.08137931
2      Edgar         Poe 0.30245512
3       Walt     Whitman 0.62542554
4       Jane      Austen 0.40573224

df2 定义为

upper_boundary <- seq(0,1.6,0.2)
class_value <- c(1:9)
df2 <- data.frame(upper_boundary, class_value)

并将其输出为

  upper_boundary class_value
1            0.0           1
2            0.2           2
3            0.4           3
4            0.6           4
5            0.8           5
6            1.0           6
7            1.2           7
8            1.4           8
9            1.6           9

我想做的是在第一个数据框类值的末尾添加 df2. 输出应该类似于

       First.Name Second.Name  num_value     class_value  
    1       John         Doe 0.08137931         2
    2      Edgar         Poe 0.30245512         3
    3       Walt     Whitman 0.62542554         5
    4       Jane      Austen 0.40573224         4

提前致谢

【问题讨论】:

  • 阅读函数cut
  • FYI ArminCehajic,标记为重复主要是为了让以前完全可以接受的答案继续获得关注,而不是从您的问题或这里的答案中删除。如果您选择,我相信您仍然可以accept 这些答案之一。问题顶部的“重复”横幅向后续读者表明这不是第一个/唯一的解决方案;事实上,这里的答案很可能是为此而个性化的,但其他(链接的)问题通常有更完整/详细的答案。

标签: r


【解决方案1】:

cutfindInterval 将在这里工作。我会用第二个,

df1$class_value <- df2$class_value[ findInterval(df1$num_value, df2$upper_boundary) ]
df1
#   First.Name Second.Name num_value class_value
# 1       John         Doe 0.1908379           1
# 2      Edgar         Poe 0.5045381           3
# 3       Walt     Whitman 0.1925997           1
# 4       Jane      Austen 0.2674465           2

【讨论】:

【解决方案2】:

尝试cut,如下所示

df1$class_value <- df2$class_value[as.integer(cut(df1$num_value,df2$upper_boundary))+1]

【讨论】:

  • 很可能是骗子,请先搜索再回答。
  • as.integer! +1
  • ThomasIsCoding,我想了很多次,你知道findIntervalas.integer(cut(...))之间有什么区别吗?我经常这样做(as.int(cut)),但正在成长为 findInt。
  • @r2evans 它们非常相似,但在区间的索引上有所不同。也许您可以看到在两个命令中使用相同的中断时
猜你喜欢
  • 1970-01-01
  • 2019-07-17
  • 2018-08-20
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多