簡體   English   中英

使用mapply在數據幀中進行間接尋址

[英]Using mapply for indirect addressing in a data frame

使用以下兩個數據框

> d1
  keystr keynum 
1    abc      5
2    def      2
3    def      7 
4    abc      3 

> d2
   HD  2  3  5  7
1 abc  H  I  J  K
2 def  L  M  N  P

我想插入使用的弦一柱D1 $ VAL keystr和數量keynum作為指數d2的數據幀。 結果應該是:

> d1
  keystr keynum  val
1    abc      5    J
2    def      2    L
3    def      7    P 
4    abc      3    I 

這應該是mapply的間接應用。 我怎樣才能制作下面的代碼

d1 <- data.frame("keystr"=c("abc","def","def","abc"), "keynum"=c(5,2,7,3))
d2 <- data.frame("HD"=c("abc","def"),
                 "2"=c("H","L"), "3"=c("I","M"),
                 "5"=c("J","N"), "7"=c("K","P"))
d1$val <- mapply(function(kstr,knum) d2[kstr,knum],
                 d1$keystr, d1$keynum )

以這種(間接)方式訪問條目?

如果你沒有限制使用mapply你可以加入:

碼:

library(tidyverse)
d1 <- data.frame("keystr"=c("abc","def","def","abc"), "keynum"=c(5,2,7,3))
d2 <- data.frame("HD"=c("abc","def"),
                 "2"=c("H","L"), "3"=c("I","M"),
                 "5"=c("J","N"), "7"=c("K","P"))

d2 %>%
  gather(keynum, value, -HD) %>%
  mutate(keynum = as.numeric(gsub(keynum, pattern = "X", replacement = ""))) %>%
  left_join(y = ., x = d1, by = c("keystr" = "HD", "keynum"))

輸出:

  keystr keynum value
1    abc      5     J
2    def      2     L
3    def      7     P
4    abc      3     I

我們可以轉換數據框,然后通過進行合並。

library(dplyr)
library(tidyr)

d3 <- d2 %>%
  gather(keynum, letter, -HD) %>%
  mutate(keynum = as.numeric(sub("X", "", keynum)))

d4 <- d1 %>%
  left_join(d3, by = c("keystr" = "HD", "keynum"))
d4
#   keystr keynum letter
# 1    abc      5      J
# 2    def      2      L
# 3    def      7      P
# 4    abc      3      I

數據

請注意,我在創建數據幀時設置stringsAsFactors = FALSE

d1 <- data.frame("keystr"=c("abc","def","def","abc"), "keynum"=c(5,2,7,3),
                 stringsAsFactors = FALSE)
d2 <- data.frame("HD"=c("abc","def"),
                 "2"=c("H","L"), "3"=c("I","M"),
                 "5"=c("J","N"), "7"=c("K","P"),
                 stringsAsFactors = FALSE)

如果轉換為矩陣並且cbind列字符值,則可以使用d1列索引d2 [-1]中的字符值。 它創建了一個二維查找表,您可以同時為行和列傳遞索引。 然后你也可以對它傳遞一個二維矩陣來生成一個輸出向量。 (也可以使用3或4或更高的D索引與R數組,其中on = e將通過3,4或更高數量的列矩陣):

( m2 <- sapply(d2[ , -1], as.character) )
#------
     2   3   5   7  
[1,] "H" "I" "J" "K"
[2,] "L" "M" "N" "P"

rownames(m2) <- as.character(d2[[1]])
m2
#--------
    2   3   5   7  
abc "H" "I" "J" "K"
def "L" "M" "N" "P"


(d1$val <-  m2[ cbind(as.character(d1[[1]]),as.character(d1[[2]])) ])
[1] "J" "L" "P" "I"

 d1
#--------
  keystr keynum val
1    abc      5   J
2    def      2   L
3    def      7   P
4    abc      3   I

注意需要重復使用as.character ,因為那些是因子列。 更好的構造是使用stringsAsFactors=FALSE構建data.frames。 構建矩陣將很快並且索引可能非常有效。

您可以使用基R重新整形和加入data.frames:

d1 <- read.table(text = 'keystr keynum 
1    abc      5
2    def      2
3    def      7 
4    abc      3', stringsAsFactors = FALSE)

d2 <- read.table(text = 'HD  2  3  5  7
1 abc  H  I  J  K
2 def  L  M  N  P', stringsAsFactors = FALSE, check.names = FALSE)

d2 <- reshape(d2, idvar = "HD", varying = names(d2)[-1], v.names = "val",
              times = names(d2)[-1], direction = "long")
merge(d1, d2, by.x = c("keystr", "keynum"), by.y = c("HD", "time"))
#>   keystr keynum val
#> 1    abc      3   I
#> 2    abc      5   J
#> 3    def      2   L
#> 4    def      7   P

我認為OP正確地認為mapply可以為他提供直接的解決方案。 他是非常接近與他的工作解決方案mapply方法。 只需糾正比較行選擇的邏輯,然后使用paste0d2選擇列。

d1$val <- mapply(function(x,y)d2[d2$HD==x,paste0("X",y)],d1$keystr, d1$keynum)
d1
#    keystr keynum val
# 1    abc      5   J
# 2    def      2   L
# 3    def      7   P
# 4    abc      3   I
# 

添加了check.names = False以啟用以數字開頭的data.frame列名。 索引具有兩列的cbind()矩陣, i, j對將一次全部提取。

d1 <- data.frame("keystr"=c("abc","def","def","abc"), "keynum"=c(5,2,7,3))
d2 <- data.frame("HD"=c("abc","def"),
                 "2"=c("H","L"), "3"=c("I","M"),
                 "5"=c("J","N"), "7"=c("K","P"), check.names=FALSE)

d1$val <- mapply(function(kstr,knum) d2[cbind(match(kstr, d1$keystr),
                                              match(knum, names(d2)))],
                 d1$keystr,
                 d1$keynum)

  keystr keynum val
1    abc      5   J
2    def      2   L
3    def      7   P
4    abc      3   I

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM