В моей data.table
я хотел нумеровать записи, если есть более чем по одному в каждой группе by
:как IfElse (в data.table) работает
dt1 <- data.table(col1=1:4, col2 = c('A', 'B', 'B', 'C'))
# col1 col2
# 1: 1 A
# 2: 2 B
# 3: 3 B
# 4: 4 C
dt1[, col3:={
if (.N>1) {paste0((1:.N), "_", col2)} else {col2};
}, by=col2]
# col1 col2 col3
# 1: 1 A A
# 2: 2 B 1_B
# 3: 3 B 2_B
# 4: 4 C C
Это прекрасно работает, но не работает, когда я пытались использовать ifelse()
вместо:
dt1[, col4:=ifelse (.N>1, paste0((1:.N), "_", col2), col2), by=col2]
# col1 col2 col3 col4
# 1: 1 A A A
# 2: 2 B 1_B 1_B
# 3: 3 B 2_B 1_B
# 4: 4 C C C
может кто-нибудь объяснить, почему?
'.N> 1' не является вектором, это скаляр. Кроме того, если он не сломан, не исправляйте его. – MichaelChirico
'ifelse' возвращает одно значение для каждого теста. Вы хотели больше одного. Он возвращает только «1_B», как он был создан. –
@PierreLafortune, спасибо, похоже, это дубликат этого вопроса. Я просто ожидал, что «одно значение» может быть и одним векторным значением. Текущее поведение выглядит довольно интуитивно для меня, но ОК –