Математические операции над столбцами, заданными вектором в R - PullRequest
1 голос
/ 14 января 2020

Мне нужно заменить указанные c значения в подмножестве столбцов в моем фрейме данных. В частности, мне нужно заменить значение 1 в этом подмножестве столбцов на 0,9999. Я создал вектор, содержащий имена столбцов столбцов, где требуется замена. Эти столбцы должны иметь подмножество по имени, а не по номеру столбца.

peaches <- c( 0, 1, 0, 1)
bananas <- c( 0, 1, 1, 1)
apples <- c( 1, 1, 1, 1)
oranges <- c (0, 0, 0, 1)
fruits <- data.frame(peaches, bananas, apples, oranges)
vector <- c("apples", "bananas", "peaches")

Моя первая попытка выглядела следующим образом:

fruits[vector][fruits[vector] == 1] <- 0.9999

Хотя он работает для этого небольшого набора данных, он не преобразует значения в большом наборе данных, с которым я работаю. Кто-нибудь знает почему?

Ответы [ 3 ]

2 голосов
/ 14 января 2020

Решение Tidyverse

library(tidyverse)

peaches <- c( 0, 1, 0, 1)
bananas <- c( 0, 1, 1, 1)
apples <- c( 1, 1, 1, 1)
oranges <- c (0, 0, 0, 1)
fruits <- data.frame(peaches, bananas, apples, oranges)
vector <- c("apples", "bananas", "peaches")

fruits %>% 
  mutate_at(vector, ~ replace(., . == 1, .9999))
#>   peaches bananas apples oranges
#> 1  0.0000  0.0000 0.9999       0
#> 2  0.9999  0.9999 0.9999       0
#> 3  0.0000  0.9999 0.9999       0
#> 4  0.9999  0.9999 0.9999       1

Создано в 2020-01-14 с помощью пакета представительства (v0.3.0)

1 голос
/ 14 января 2020

Вы можете попробовать:

fruits[,vector] <- setDT(lapply(fruits[,vector], function(x) replace(x, x==1, 0.9999)))

  peaches bananas apples oranges
1  0.0000  0.0000 0.9999  0.0000
2  0.9999  0.9999 0.9999  0.0000
3  0.0000  0.9999 0.9999  0.0000
4  0.9999  0.9999 0.9999  0.9999
1 голос
/ 14 января 2020

Попробуйте:

fruits[,vector][fruits[,vector] == 1] <- 0.9999

fruits[vector] использует тот факт, что data.frame представляет собой список векторов (одинаковой длины), возможно, «матричный» подход более приспособлен.

...