使用mutate()从第二个dataframe添加新列,第一个dataframe中给出了索引

wqnecbli  于 2023-09-27  发布在  其他
关注(0)|答案(4)|浏览(75)

我有一个dataframe,其中包含我的结果和另一个dataframe,其中包含例如。只有价值观。现在,我想向第一个嵌套框架添加一个新列,该列包含第二个嵌套框架中的数据。然而,第二 Dataframe 不具有与第一 Dataframe 相同的整齐格式或相同的行。但是,我想从第二个 Dataframe 中获取的值的位置在第一个 Dataframe 的两列中给出。

library(tidyverse)

df1<-data.frame(Row_no=c(1,2,3,4, 1,2,3,4), Col_no=c(1,1,2,2,3,3,4,4), > Size=c(sample(200:300, 8)))
>df1
  Row_no Col_no Size
1      1      1  226
2      2      1  208
3      3      2  297
4      4      2  211
5      1      3  209
6      2      3  296
7      3      4  273
8      4      4  261

df2=cbind(rnorm(8), rnorm(8), rnorm(8), rnorm(8), rnorm(8), rnorm(8), rnorm(8), rnorm(8))

> df2
           [,1]       [,2]       [,3]        [,4]        [,5]       [,6]        [,7]       [,8]
[1,]  *1.4568994* -0.3324945 *-0.2885171* -0.79393545 -0.02439371  1.4216918  0.07288639 -0.2441228
[2,]  *0.3648703*  0.7494033 *-0.9974556* -0.33820023 -0.30235757  1.5094486 -0.10982881  1.9349127
[3,]  0.5044991  *1.2208453* -0.8748034 *-0.86325341*  0.10462120 -0.3674390 -0.04107733  1.1815123
[4,] -1.2792906  *0.7408320* -0.2711479 *-0.07350530* -0.92132461 -0.7753123  0.99841815  1.5802167
[5,] -0.8801507  0.2580448  0.3099108  0.66716720 -0.01144132 -0.9353671  0.44608715 -0.6729589
[6,]  0.4809844  0.6349390  1.9900160  0.62358533  0.35075449  2.4124712 -1.45171943  0.4409148
[7,] -0.5146914  0.9115070 -0.3971806 -0.06477066  0.46028331  0.7067722 -0.44562194  1.9545829
[8,] -0.4299626  1.8211741  0.3272991  0.06177976  1.25383361 -0.7770162 -0.49841279  0.5098795

所需的结果将类似于以下内容(我在df2中的值周围放置了星号,以显示我想要的内容):

Row_no Col_no Size Value
1      1      1  226 1.4568994
2      2      1  208 0.3648703
3      3      2  297 1.2208453
4      4      2  211 0.7408320
5      1      3  209 -0.2885171
6      2      3  296 -0.9974556
7      3      4  273 -0.86325341
8      4      4  261 -0.07350530

但是,当我尝试运行代码时

df1%>%
 mutate(value=df2[Row_no, Col_no])

我收到错误信息

`Fehler: Column `value` must be length 8 (the number of rows) or one, not 64

这是意料之中的事但是,当我尝试索引列本身时,我得到

df1%>%
 mutate(value=df2[Row_no[1], Col_no[1]])

Row_no Col_no Size    value
1      1      1  226 1.456899
2      2      1  208 1.456899
3      3      2  297 1.456899
4      4      2  211 1.456899
5      1      3  209 1.456899
6      2      3  296 1.456899
7      3      4  273 1.456899
8      4      4  261 1.456899
> df1%>%
+   mutate(value[1]=df2[Row_no[1], Col_no[1]])
Error: Unexpected '=' in:
"df1%>%
  mutate(value[1]="

那么,如何才能得到我想要的结果呢?我宁愿有一个整洁的解决方案。此外,给出的例子只是一个最小的可复制的例子,我的真实的文件真的很大,这就是为什么我需要一个明确的解决方案.谢谢你,谢谢

v1uwarro

v1uwarro1#

感谢@Yuriy Barvinchenko,我能够找到解决方案:

df1%>%
  mutate(value=df2[cbind(Row_no, Col_no)])

> df1%>%
+   mutate(value=df2[cbind(Row_no, Col_no)])
  Row_no Col_no Size      value
1      1      1  226  1.4568994
2      2      1  208  0.3648703
3      3      2  297  1.2208453
4      4      2  211  0.7408320
5      1      3  209 -0.2885171
6      2      3  296 -0.9974556
7      3      4  273 -0.8632534
8      4      4  261 -0.0735053

重要的部分是索引括号中的cbind()

bvhaajcl

bvhaajcl2#

基于answer here

df1$value <- with( df1, df2[ cbind(Row_no, Col_no) ] )
iovurdzv

iovurdzv3#

使用purrr::pmap:

df1$Value <- unlist(pmap(list(df1$Row_no, df1$Col_no, list(df2)), ~ ..3[..1,..2]))

和管道:

df1 %>% 
  mutate(Value = pmap(list(Row_no, Col_no, list(df2)), ~ ..3[..1,..2]))
c9x0cxw0

c9x0cxw04#

问题是,当你尝试mutate(value=df2[Row_no, Col_no])时,你实际上是在生成一个由length(Row_no) * length(Col_no)元素组成的方阵,相当于df2[df1$Col_no, df1$Row_no]。仔细想想,这是一个由8个“正确”行组成的堆栈,其中正确的列编号为1到8。因此,可以在[1,1]、[2,2]、[3,3]...[n,n]处找到正确的元素,即矩阵的对角线。将这些列合并到一列的最简洁的方法是将其乘以单位矩阵,然后取行和。
我在这里复制了您的随机数据,以给予与您的示例匹配的完整解决方案。

library(tidyverse)

df1 <- data.frame(Row_no = rep(1:4, 2),
                  Col_no = rep(1:4, each = 2),
                  Size   = c(sample(200:300, 8)))

df2 <- cbind(c( 1.4568994,  -0.3324945, -0.2885171,  -0.79393545,
               -0.02439371,  1.4216918,  0.07288639, -0.2441228),
             c( 0.3648703,   0.7494033, -0.9974556,  -0.33820023,
               -0.30235757,  1.5094486, -0.10982881,  1.9349127),
             c( 0.5044991,   1.2208453, -0.8748034,  -0.86325341,
                0.10462120, -0.3674390, -0.04107733,  1.1815123),
             c(-1.2792906,   0.7408320, -0.2711479,  -0.07350530,
               -0.92132461, -0.7753123,  0.99841815,  1.5802167),
             c(-0.8801507,   0.2580448,  0.3099108,   0.66716720,
               -0.01144132, -0.9353671,  0.44608715, -0.6729589),
             c( 0.4809844,   0.6349390,  1.9900160,   0.62358533,
                0.35075449,  2.4124712, -1.45171943,  0.4409148),
             c(-0.5146914,   0.9115070, -0.3971806,  -0.06477066,
                0.46028331,  0.7067722, -0.44562194,  1.9545829),
             c(-0.4299626,   1.8211741,  0.3272991,   0.06177976,
                1.25383361, -0.7770162, -0.49841279,  0.5098795))

df1 %>% mutate(value = rowSums(df2[Col_no, Row_no] * diag(8))) %>% print

#   Row_no Col_no Size      value
# 1      1      1  267  1.4568994
# 2      2      1  283  0.3648703
# 3      3      2  259  1.2208453
# 4      4      2  235  0.7408320
# 5      1      3  212 -0.2885171
# 6      2      3  263 -0.9974556
# 7      3      4  251 -0.8632534
# 8      4      4  200 -0.0735053

相关问题