我有一个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]="
那么,如何才能得到我想要的结果呢?我宁愿有一个整洁的解决方案。此外,给出的例子只是一个最小的可复制的例子,我的真实的文件真的很大,这就是为什么我需要一个明确的解决方案.谢谢你,谢谢
4条答案
按热度按时间v1uwarro1#
感谢@Yuriy Barvinchenko,我能够找到解决方案:
重要的部分是索引括号中的cbind()。
bvhaajcl2#
基于answer here
iovurdzv3#
使用purrr::pmap:
和管道:
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]处找到正确的元素,即矩阵的对角线。将这些列合并到一列的最简洁的方法是将其乘以单位矩阵,然后取行和。我在这里复制了您的随机数据,以给予与您的示例匹配的完整解决方案。