установка значения ячейки во фрейме данных путем сопоставления строк и столбцов - PullRequest
0 голосов
/ 24 августа 2018

У меня есть фрейм данных в R, и я хочу установить значение на основе конкретного соответствия строк и столбцов из двух списков.

Вот процесс, которому я должен следовать.У меня есть фрейм данных, например:

   test.var1.t1  test.var2.t1   test.var1.t4   test.var3.t1   test.var3.t7
var1          0             0             0               0              0
var2          0             0             0               0              0
var3          0             0             0               0              0
var4          0             0             0               0              0

У меня есть функция, которая принимает в качестве ввода имя столбца и возвращает значение, связанное с именем этого столбца.Например: some_function ("test.var1.t1") может возвращать значение 10.

У меня есть список имен некоторых строк и список имен столбцов.Мне нужно просмотреть каждое имя строки и имя столбца в списке, сопоставить их вместе, оценить функцию для этого сопоставленного столбца и разместить значение во фрейме данных в соответствующей ячейке.Например,

список имен строк = "var1" "var2" "var4"

список имен столбцов = "test.var1.t1" "test.var2.t1" "test.var1.t4 "" test.var3.t1 "

var1 должен совпадать с" test.var1.t1 "и" test.var1.t4 ", поэтому мы получаем значения функций для" test.var1.t1 "и"test.var1.t4" из some_function ().Предположим, что эти значения равны 10 и 20.

var2 должен совпадать с "test.var2.t1", поэтому получите значение функции для "test.var2.t1".Скажите, что это значение равно 15.

var4 не имеет соответствующего столбца, а var3 отсутствует в списке строк, поэтому его следует оставить в кадре данных в одиночку.

Как только это будет сделано, данныекадр должен быть изменен на это:

      x.var1.t1   x.var2.t1   x.var1.t4   x.var3.t1   x.var3.t7
var1         10           0          20           0           0
var2          0          15           0           0           0
var3          0           0           0           0           0
var4          0           0           0           0           0

Каков наилучший способ сделать это?

1 Ответ

0 голосов
/ 24 августа 2018

Вы можете сделать что-то вроде этого:

nn <- c("var1" ,"var2", "var4")
## I am using a for loop because the side effect is desired here
for(x in nn) {
  ## find the corresponding column names
  col <- grep(x,names(dx),value=TRUE)
  ## if any apply the function 
  if(length(col)>0) dx[x,col] <- get_val(x)
}

Тестирование с помощью фиктивной функции get_val:

get_val <- function(x){
  switch(x,
         var1=c(15,20),
         var2=c(10))
} 

и dx:

dx <- read.table(text=" test.var1.t1  test.var2.t1   test.var1.t4   test.var3.t1   test.var3.t7
var1          0             0             0               0              0
var2          0             0             0               0              0
var3          0             0             0               0              0
var4          0             0             0               0              0",
           stringsAsFactors = FALSE)

вы получите ожидаемый результат:

#      test.var1.t1 test.var2.t1 test.var1.t4 test.var3.t1 test.var3.t7
# var1           15            0           20            0            0
# var2            0           10            0            0            0
# var3            0            0            0            0            0
# var4            0            0            0            0            0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...