Для полноты: в больших векторах вы можете использовать индексы для ускорения работы (мы часто это делаем в симуляциях, где функции обычно выполняются от 1000 до 10000 раз). Но пока это не нужно, просто используйте ifelse
. Это читается намного проще.
> set.seed(100)
> x <- runif(1000,1,10)
> system.time(replicate(10000,{
+ y <- ifelse(x < 5,1,2)
+ }))
user system elapsed
2.56 0.08 2.64
> system.time(replicate(10000,{
+ y <- rep(2,length(x))
+ y[x < 5]<- 1
+ }))
user system elapsed
0.48 0.00 0.48
Использовать, если id
- столбец:
df['correct'] = df.iloc[:, 1:].ne(0).all(axis=1)
#alternative solution
#df['correct'] = ~df.iloc[:, 1:].eq(0).any(axis=1)
print (df)
id col_1 col_2 col_3 correct
0 'jk3' 1.0 1.0 NaN True
1 'kp2' 1.0 1.0 1.0 True
2 'po0' 0.0 1.0 0.0 False
3 'in6' NaN 0.0 1.0 False
4 'ml5' 1.0 NaN 0.0 False
5 'lj3' 1.0 0.0 NaN False
Подробности:
Сначала удалите все столбцы без первого с помощью iloc
:
print (df.iloc[:, 1:])
col_1 col_2 col_3
0 1.0 1.0 NaN
1 1.0 1.0 1.0
2 0.0 1.0 0.0
3 NaN 0.0 1.0
4 1.0 NaN 0.0
5 1.0 0.0 NaN
Сравнение не равно ne
:
print (df.iloc[:, 1:].ne(0))
col_1 col_2 col_3
0 True True True
1 True True True
2 False True False
3 True False True
4 True True False
5 True False True
Последняя проверка all
True
s для строк:
print (df.iloc[:, 1:].ne(0).all(axis=1))
0 True
1 True
2 False
3 False
4 False
5 False
dtype: bool
И если id
является индексом:
df['correct'] = df.ne(0).all(axis=1)
print (df)
col_1 col_2 col_3 correct
id
'jk3' 1.0 1.0 NaN True
'kp2' 1.0 1.0 1.0 True
'po0' 0.0 1.0 0.0 False
'in6' NaN 0.0 1.0 False
'ml5' 1.0 NaN 0.0 False
'lj3' 1.0 0.0 NaN False
Проверьте df.count (), он дает ненулевой счет кадра данных, тогда вы можете назначить его true / false по своему усмотрению.