вычислить каждую строку с некоторыми значениями в списке

#r #dataframe #vector

#r #фрейм данных #вектор

Вопрос:

Мне интересно, как правильно выполнить векторное вычисление в R.

У меня есть набор данных, подобный этому.

             stay cops graduation
hinshi_#0  54722 6945      83674
hinshi_#1  13928 1798      21616
hinshi_#2    320   49        485
hinshi_#3  36010 4984      55184
hinshi_#4   7484  916      10618
hinshi_#5      6    0          6
hinshi_#6   6605  830       9741
hinshi_#7      2    0          5
  

и у меня тоже есть список l<-c(20124 2682 30138) .
Что я хочу здесь сделать, так это разделить каждую строку datatable на список.
Позвольте мне выбрать первую строку данных,

  hinshi_#0  54722 6945      83674
  

Я хочу, чтобы они были похожи 54722/20124, 6945/2682, 83764/30138 — вычислить первое значение vector с первым значением списка, то же самое должно произойти со вторым и третьим тоже. Есть хороший способ справиться с этим? Спасибо.

Комментарии:

1. «и у меня есть список l<-c(20124 2682 30138)» Поскольку это недопустимый R-код, не могли бы вы уточнить, l это a list или a vector ?

2. Я думаю, что самый простой способ сделать это — транспонировать ваши данные, а затем разделить их на вектор. Что-то вроде t (dataset) /l

Ответ №1:

При условии, что я вас правильно понял, вот вариант

 l <- c(20124, 2682, 30138)

df / sapply(l, rep, each = nrow(df))
#                  stay       cops   graduation
#hinshi_#0 2.719241e 00 2.58948546 2.7763620678
#hinshi_#1 6.921089e-01 0.67039523 0.7172340567
#hinshi_#2 1.590141e-02 0.01826995 0.0160926405
#hinshi_#3 1.789406e 00 1.85831469 1.8310438649
#hinshi_#4 3.718943e-01 0.34153617 0.3523126949
#hinshi_#5 2.981515e-04 0.00000000 0.0001990842
#hinshi_#6 3.282151e-01 0.30947054 0.3232132192
#hinshi_#7 9.938382e-05 0.00000000 0.0001659035
  

Пример данных

 df <- read.table(text =
    "stay cops graduation
'hinshi_#0'  54722 6945      83674
'hinshi_#1'  13928 1798      21616
'hinshi_#2'    320   49        485
'hinshi_#3'  36010 4984      55184
'hinshi_#4'   7484  916      10618
'hinshi_#5'      6    0          6
'hinshi_#6'   6605  830       9741
'hinshi_#7'      2    0          5", header = T)
  

Комментарии:

1. Спасибо! это сработало, но я тоже получил некоторое предупреждение — 1: In FUN(X[[i]], ...) : first element used of 'each' argument , я знаю, что это просто предупреждение, но мне просто любопытно, что это на самом деле означает. Спасибо!

2. @user9191983 Основываясь на приведенных вами примерах данных, это должно выполняться без какого-либо предупреждения. each это просто количество ваших строк data.frame и является скаляром. Пожалуйста, дважды проверьте свои данные.

Ответ №2:

l является вектором, как указано (исправлено) в ответе @Maurits Ever. Мы можем использовать purrr :

 as.data.frame(purrr::map2(df,l,function(x,y) x/y))
  

Результат(может быть отформатирован для удаления научного отображения):

     stay       cops   graduation
1 2.719241e 00 2.58948546 2.7763620678
2 6.921089e-01 0.67039523 0.7172340567
3 1.590141e-02 0.01826995 0.0160926405
4 1.789406e 00 1.85831469 1.8310438649
5 3.718943e-01 0.34153617 0.3523126949
6 2.981515e-04 0.00000000 0.0001990842
7 3.282151e-01 0.30947054 0.3232132192
8 9.938382e-05 0.00000000 0.0001659035
  

Комментарии:

1. Спасибо! я пытался, но вижу что-то не так here…it похоже, что вычисление выполняется между строкой и столбцами (не строка со строкой), потому что я получил ошибку типа Error: 'x' (87) and '.y' (3) are different lengths

2. Не могли бы вы показать, какой код вы использовали?! Трудно понять, поскольку я получаю доступ только к набору данных toy.