Как мне зациклить вектор строк и другой вектор чисел одновременно в R? - PullRequest
0 голосов
/ 08 января 2019

Я хочу зациклить индекс строк, которые соответствуют столбцам кадра данных (d), чтобы поместить эти столбцы в новый кадр данных (h). Но вместо того, чтобы копировать содержимое столбцов, добавление отдельного номера для каждого столбца. Числа указаны в векторе numvec. Вот мой пример кода:

   d<-data.frame(replicate(5,sample(0:9,300,rep=TRUE)))
   d$rn<-replicate(1,"mystring")
   h<-as.data.frame(d[,6])
   colnames(d)<-c("first","second","third","fourth","fifth")
   trtvec<-colnames(d)
   numvec<-c(2,8,7,6,5)

   #loop for each trait
   for(i in seq_along(trtvec))
   {
       h$trtvec[i]<-d$trtvec[i]+numvec[i]

   }

В принципе, уже первая часть

h$trtvec[i]<-d$trtvec[i]

не похоже на работу. Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Если я правильно понимаю, следующее делает то, что вы хотите.
Он использует цикл apply для добавления numvec к каждому 5 элементам строк фрейма данных d.

h <- d[6]
numvec <- c(2, 8, 7, 6, 5)

h1 <- cbind(h, t(apply(d[1:5], 1, '+', numvec)))
head(h1)
#        rn first second third fourth fifth
#1 mystring     3     11     9     12    11
#2 mystring     8     17     8     10     8
#3 mystring     8     13     8     15    12
#4 mystring     8     12    12     10     7
#5 mystring    10     17    11     15     5
#6 mystring     8     12    10      6    14

Если вы хотите, чтобы столбец rn был последним, используйте cbind.data.frame и измените порядок аргументов.

h2 <- cbind.data.frame(t(apply(d[1:5], 1, '+', numvec)), h)
head(h2)
#  first second third fourth fifth       rn
#1     3     11     9     12    11 mystring
#2     8     17     8     10     8 mystring
#3     8     13     8     15    12 mystring
#4     8     12    12     10     7 mystring
#5    10     17    11     15     5 mystring
#6     8     12    10      6    14 mystring
0 голосов
/ 08 января 2019

Вы можете использовать sapply для имен выбранных столбцов, как это

data <- data.frame(a = rep(0, 100) b = rep(1, 100), c = rep(2, 100))

# using a named vector to simplify indexing
num.vec <- c(a = 2, b = 3)

# add the corresponding number to selected columns
new.data <- sapply(names(num.vec), FUN = function(x) data[,x] + num.vec[x])

head(new.data, 1)

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