【问题标题】:Look up/match values within the same dataframe column in R在 R 中的同一数据框列中查找/匹配值
【发布时间】:2021-03-25 09:37:50
【问题描述】:

鉴于data.frame(code=c(10, 20, 21, 22, 23, 31, 32, 40, 50), label=c("a", "b", "c", "d", "e", "f", "g", "h", "i")),我想要c("", "", "b", "b", "b", "", "", "", "")

如果该值不是 10 的倍数,则分配前一个 10 倍数的标签(如果已列出)。如果没有列出 10 的前一个倍数,则分配空白。如果该值是 10 的倍数,则分配空白。 (与这个虚拟示例不同,数据中可能出现多个非 10 的倍数的序列,并且值可能没有排序。)

理想情况下,为了速度和简约,我想将其作为基数 R 中的向量运算。

编辑:我试图尽可能简化我的问题,但可能会产生误导,所以这是我的目标最终输出:data.frame(code=c(10, 20, 21, 22, 23, 31, 32, 40, 50), label=c("a", "b", "b c", "b d", "b e", "f", "g", "h", "i"))。即:将中间输出添加到标签列。

【问题讨论】:

  • 您的预期输出是否需要更正?
  • 对不起,我不明白这个问题。
  • 你能解释一下你是如何达到预期输出的吗?
  • 对不起,我试图澄清 OP 中的语言。

标签: r vector conditional-statements


【解决方案1】:

这看起来有点矫枉过正,但似乎有效:

library(dplyr)
library(tidyr)

df %>%
  #arrange the data based on value
  arrange(code) %>%
  #Get closest multiple of 10
  mutate(multiple10 = floor(code/10) * 10,
         #If completely divisible by 10 assign label else NA
         result = ifelse(code %% 10 == 0, label, NA)) %>%
  #For each multiple of 10
  group_by(multiple10) %>%
  #fill NA by most recent non-NA in the group
  fill(result) %>%
  ungroup %>%
  #Turn NA to blank along with numbers which are completely divisible by 10
  mutate(result = replace(result, code == multiple10 | is.na(result), ''))

#  code label multiple10 result
#  <dbl> <chr>      <dbl> <chr> 
#1    10 a             10 ""    
#2    20 b             20 ""    
#3    21 c             20 "b"   
#4    22 d             20 "b"   
#5    23 e             20 "b"   
#6    31 f             30 ""    
#7    32 g             30 ""    
#8    40 h             40 ""    
#9    50 i             50 ""    

【讨论】:

  • 感谢 Ronak,但我需要向量形式的结果,以便将其与现有标签向量连接。我将更新 OP 以反映这一额外步骤。
  • 我认为您不需要对我当前的答案进行太多更改来实现它。添加result = paste0(result, label) 应该可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 2016-12-11
  • 2021-08-29
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
相关资源
最近更新 更多