Извлечение столбцов во фрейме данных с конкретными значениями - PullRequest
0 голосов
/ 07 января 2012

Я хочу изменить значение альтернативных столбцов кадра данных на 0, которые меньше 1. Например,

abc 1   ghf 3
def 3   ftr 6
scf 0.2 ugh 1

Все значения второго и третьего столбцов, которые меньше единицы, должны стать нулевыми.

Есть ли способ сделать это в R?

Ответы [ 2 ]

5 голосов
/ 07 января 2012

Это на самом деле работает, и может быть трудно улучшить его простоту:

df[ df<1 ] <- 0

Альтернативный подход (но менее компактный): Когда используется с arr.ind=TRUE, возвращает двухколоночную матрицустроки и столбцы, где условие TRUE.Вы можете использовать это с [<-.data.frame, но это должно быть сделано в виде числовых индексов

 idxs <- which(df <1, arr.ind=TRUE)
#Warning messages:
#1: In Ops.factor(left, right) : < not meaningful for factors
#2: In Ops.factor(left, right) : < not meaningful for factors
### Perfectly safe to ignore the warning
 df[ idxs[,1], idxs[,2] ] <- 0
 df
#------------------
   V1 V2  V3 V4
1 abc  1 ghf  3
2 def  3 ftr  6
3 scf  0 ugh  1
1 голос
/ 07 января 2012

Было бы полезно, если бы вы предоставили свои данные в формате, который можно использовать немедленно dput( myData ), выход которого можно присвоить переменной:

> df <- structure(list(V1 = structure(1:3, .Label = c("abc", "def", "scf"                                        
), class = "factor"), V2 = c(1, 3, 0.2), V3 = structure(c(2L, 1L,                                          
3L), .Label = c("ftr", "ghf", "ugh"), class = "factor"), V4 = c(3L,                                      
6L, 1L)), .Names = c("V1", "V2", "V3", "V4"), row.names = c(NA,                                          
-3L), class = "data.frame")

> df
   V1   V2  V3 V4 
1 abc    1 ghf  3
2 def    3 ftr  6 
3 scf  0.2 ugh  1

Вы говорите «все значения второго и третьего столбца ...», но вы, вероятно, имеете в виду «второй и четвертый ...». Вот что я бы сделал:

> df$V2 <- ifelse( df$V2 < 1, 0, df$V2 )
> df$V4 <- ifelse( df$V4 < 1, 0, df$V4 )
> df
   V1 V2  V3 V4
1 abc  1 ghf  3
2 def  3 ftr  6
3 scf  0 ugh  1

Больше см. ?ifelse, но я думаю, что это уже должно помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...