У меня есть набор данных, как это:

df<-read.table (text=" House1   House2  House3  House 4
9   4   8   3
8   6   3   3
9   9   6   5
8   8   3   9
9   5   5   10
4   3   8   6
3   6   10  3
9   8   6   8
3   9   10  5
7   8   2   4
", header=TRUE)

Значения 2,4,3 и 1,5 умножаются в каждом ряду. 2 переходит в Дом 1, 4 переходит в Дом 2, 3 переходит в столбец 3, а 1 - в Дом 4. Это дает мне следующую таблицу:

House1  House2  House3  House 4
18  16  24  4.5
16  24  9   4.5
18  36  18  7.5
16  32  9   13.5
18  20  15  15
8   12  24  9
6   24  30  4.5
18  32  18  12
6   36  30  7.5
14  32  6   6

Есть ли простой код для этого?

r
1
user330 22 Июл 2020 в 00:01

4 ответа

Лучший ответ

Мы можем транспонировать набор данных, умножить на вектор и транспонировать вывод

df[] <- t(t(df) * c(2, 4, 3, 1.5))

Или используя sweep

sweep(df,  2, c(2, 4, 3, 1.5), `*`)
2
akrun 21 Июл 2020 в 21:03

Еще один базовый вариант R с использованием умножения матриц:

df[]<-as.matrix(df)%*%diag(c(2, 4, 3, 1.5))

Такой, что

> df
   House1 House2 House3 House4
1      18     16     24    4.5
2      16     24      9    4.5
3      18     36     18    7.5
4      16     32      9   13.5
5      18     20     15   15.0
6       8     12     24    9.0
7       6     24     30    4.5
8      18     32     18   12.0
9       6     36     30    7.5
10     14     32      6    6.0
1
ThomasIsCoding 21 Июл 2020 в 21:16

Хотя и не так элегантно, как некоторые другие решения, вы также можете использовать apply:

df[] <- t(apply(df, 1, function(x) x*c(2, 4, 3, 1.5)))

< Сильный > Выход

> df
   House1 House2 House3 House4
1      18     16     24    4.5
2      16     24      9    4.5
3      18     36     18    7.5
4      16     32      9   13.5
5      18     20     15   15.0
6       8     12     24    9.0
7       6     24     30    4.5
8      18     32     18   12.0
9       6     36     30    7.5
10     14     32      6    6.0
0
slava-kohut 21 Июл 2020 в 21:21

(Я полагаю, что sweep Акруна немного более элегантен, чем этот.)

data.frame - ориентированный путь будет

df2 <- as.data.frame(Map(`*`, df, c(2, 4, 3, 1.5)))
df2
#    House1 House2 House3 House4
# 1      18     16     24    4.5
# 2      16     24      9    4.5
# 3      18     36     18    7.5
# 4      16     32      9   13.5
# 5      18     20     15   15.0
# 6       8     12     24    9.0
# 7       6     24     30    4.5
# 8      18     32     18   12.0
# 9       6     36     30    7.5
# 10     14     32      6    6.0

Или, если вы умножаете его на месте , то

df[] <- Map(`*`, df, c(2, 4, 3, 1.5))
2
r2evans 21 Июл 2020 в 21:10