R语言 根据其他行是否唯一来选择行的值

to94eoyn  于 2023-04-03  发布在  其他
关注(0)|答案(3)|浏览(132)

我需要在我的数据中创建一个新列,如果“id”只出现一次,它将等于“tender”值,如果“id”不出现,它将等于“lot”值。我无法通过任何与NA有关的内容来完成此操作,因为数据不完整,并且其中有很多NA。我的想法是这样做,如果“id”是唯一的,则选择

df <- data.frame('id'=c(1,1,2,3,3,4), 
                 'lot'=c(10,20,NA,40,50,NA), 'tender'=c(30,30,30,90,90,40))

我希望输出为:

data.frame('id'=c(1,1,2,3,3,4), 'lot'=c(10,20,NA,40,50,NA), 
           'tender'=c(30,30,30,90,90,40),'price'=c(10,20,30,40,50,40))
0lvr5msh

0lvr5msh1#

根据这个条件,我们可以用case_when做一个群

library(dplyr)
df %>% 
  group_by(id) %>%
  mutate(price = case_when(n() ==1 & is.na(lot) ~ tender, TRUE ~ lot))

在OP的当前示例中,coalesce也可以工作

df %>%
   mutate(price = coalesce(lot, tender))
qij5mzcb

qij5mzcb2#

我们可以这样做:

df$price <- apply(df, 1, function(x) min(x["lot"], x["tender"], na.rm = TRUE))

或者在dplyr解决方案中为:
x一个一个一个一个x一个一个二个x

qojgxg4l

qojgxg4l3#

基于此描述,可以对data.table中的组大小使用if语句
我需要在我的数据中创建一个新的列,如果“id”只出现一次,它将等于“tender”值,如果它不出现,它将等于“lot”值。

library(data.table)
setDT(df)

df[, price := if(.N == 1) tender else lot, by = id]
#    id lot tender price
# 1:  1  10     30    10
# 2:  1  20     30    20
# 3:  2  NA     30    30
# 4:  3  40     90    40
# 5:  3  50     90    50
# 6:  4  NA     40    40

相关问题