Я не вижу проблемы для Pascal?
Этот неверный отступ.
if a then
if b then
x = 1;
else
y = 1;
Удаление полуколоны после x = 1 сделает ее правильной с отступом.
Этот правильный отступ
if a then
if b then
x = 1;
else
y = 1;
Однострочник может быть,
data[rowSums(data[-1]) > 0,] <- replace(data[rowSums(data[-1]) > 0,],
data[rowSums(data[-1]) > 0,] == 0,
NA)
data
# id V1 V2 V3
#1 A 1 NA 1
#2 B 0 0 0
#3 C NA NA 1
Чтобы избежать повторного вычисления одного и того же выражения, мы можем сначала определить его, т.е.
v1 <- rowSums(data[-1]) > 0
data[v1,] <- replace(data[v1,],
data[v1,] == 0,
NA)
Это легко с dplyr
, если вы хотите изменить значения для столбцов V1
и V2
на основе значений в V3
. Мы можем указать столбцы, для которых мы хотим изменить значения, в mutate_at
, а в аргументе funs
указать условие, для которого вы хотите изменить значения.
library(dplyr)
data %>% mutate_at(vars(V1:V2), funs(replace(., V3 == 1 & . == 0, NA)))
# id V1 V2 V3
#1 A 1 NA 1
#2 B 0 0 0
#3 C NA NA 1
Мы можем сделать это в base R
, создав логический вектор с rowSums
, а затем обновить числовые столбцы на основе этого индекса
i1 <- rowSums(data[-1] == 1) > 0
data[-1][i1,] <- NA^ !data[-1][i1,]
data
# id V1 V2 V3
#1 A 1 NA 1
#2 B 0 0 0
#3 C NA NA 1
Если индекс должен быть основан в одном столбце, скажем «V3», измените «i1» на
i1 <- data$V3 == 1
и обновите другие числовые столбцы после подстановки строк в «i1», создайте логическую матрицу с отрицанием (!
- возвращает TRUE для 0 значений и все остальные FALSE). Затем, используя NA^
на логической матрице, возвращает NA для TRUE и 1 для других значений. Поскольку существуют только двоичные значения, это можно обновить
data[i1, 2:3] <- NA^!data[i1, 2:3]