对于确定另一列是否包含更大或更小数字的每个值

aja*_*ess 5 r dataframe

我正在查看螺栓的一些数据.如果我有例如

 diameter     thread
 1            4
 1            6
 1            4
 2            5
 2            7
 3            9
Run Code Online (Sandbox Code Playgroud)

我想要一种方法来制作一个新的列,告诉我它是每个直径的最大或最小线程.每个直径的螺纹尺寸不超过2个,但偶尔只有1个,在这种情况下我希望它的尺寸​​大.例如:

diameter     thread    size
  1            4       small
  1            6       large
  1            4       small
  2            5       small
  2            7       large
  3            9       large
Run Code Online (Sandbox Code Playgroud)

Zac*_*urn 5

很容易使用 dplyr

library(dplyr)
data <- data.frame(diameter=c(1,1,2,2,3),thread=c(4,6,5,7,9))
data %>% group_by(diameter) %>% mutate(size=ifelse(thread==max(thread),"large","small"))

   diameter thread  size
      (dbl)  (dbl) (chr)
1        1      4 small
2        1      6 large
3        2      5 small
4        2      7 large
5        3      9 large
Run Code Online (Sandbox Code Playgroud)


tal*_*lat 2

ave这是使用group by 的基本 R 选项diameter。我还创建了一个小辅助函数f来提高可读性。

# define function f:
f <- function(x) (if(length(x)==1) 1L else x == max(x)) + 1L
# apply f to each thread by group of diameter:
dat$size <- c("small", "large")[ave(dat$thread, dat$diameter, FUN = f)]

#  diameter thread  size
#1        1      4 small
#2        1      6 large
#3        2      5 small
#4        2      7 large
#5        3      9 large
Run Code Online (Sandbox Code Playgroud)