簡體   English   中英

R從帶有向量的數據框中提取值

[英]R Extract values from data frame with vectors

我希望我的問題不會重復,但我確實找不到我需要的東西。 我潛入dplyr,甚至從DataCamp參加了data.table課程,但我無法解決。 也許俯瞰什么?

我有這個df:

set.seed(1964)
df<-data.frame(id = c( "XEY", "NZH", "DYE", "JNF", "LHH", "WNB"),
           q_1 = sample(5,6, replace = TRUE),
           q_2 = sample(5,6, replace = TRUE),
           q_3 = sample(5,6, replace = TRUE),
           q_4 = sample(5,6, replace = TRUE),
           q_5 = sample(5,6, replace = TRUE))

所以我的df看起來像這樣:

在此處輸入圖片說明

接下來,我有兩個向量,分別是id(行指示符)和q(問題號),如下所示:

id <- c("XEY", "DYE", "JNF", "DYE", "XEY", "LHH", "WNB", "JNF" )
question <- c("val_1", "val_1","val_3","val_3","val_3", "val_4", "val_4", "val_5")

我想使用兩個向量從df中提取值以得到如下輸出:

在此處輸入圖片說明

我已經嘗試了很多方法來提取值,但是我不斷出錯。 我已經嘗試過類似的事情:

df[id == (id[1]), (question[1])]
df[id == id[1], question[1]]

奇怪的是,data.table包似乎接受了“行符號”。 因為:

df[id == (id[1]),]

返回“ XEY”行的valuea:

    id q_1 q_2 q_3 q_4 q_5
1: XEY   5   1   5   4   1

但是,如何使用我的向量為正確的列符號做些技巧呢?

很抱歉這個非常基本的問題,感謝您的幫助。

你可以用提迪爾做。 我在您的df中添加了stringsAsFactors = FALSE以避免在連接過程中出現警告。

set.seed(1964)
df<-data.frame(id = c( "XEY", "NZH", "DYE", "JNF", "LHH", "WNB"),
       q_1 = sample(5,6, replace = TRUE),
       q_2 = sample(5,6, replace = TRUE),
       q_3 = sample(5,6, replace = TRUE),
       q_4 = sample(5,6, replace = TRUE),
       q_5 = sample(5,6, replace = TRUE),stringsAsFactors=FALSE)
id <- c("XEY", "DYE", "JNF", "DYE", "XEY", "LHH", "WNB", "JNF" )
question <- c("q_1", "q_1","q_3","q_3","q_3", "q_4", "q_4", "q_5")

library(tidyr)
df2 <- data.frame(id,question,stringsAsFactors=FALSE)
df %>% gather(k,Value,-id) %>% inner_join(df2,by="id") %>% filter(question==k) %>% arrange(question) %>%
    select(-k)

在基數R中,您可以執行以下操作。

Value <- diag(as.matrix(df[match(id, df$id), sub("val", "q", question)]))
result <- data.frame(id, Question = sub("val", "q", question), Value)
result
#   id Question Value
#1 XEY      q_1     5
#2 DYE      q_1     1
#3 JNF      q_3     2
#4 DYE      q_3     1
#5 XEY      q_3     5
#6 LHH      q_4     2
#7 WNB      q_4     2
#8 JNF      q_5     3

編輯。

在看到@ Nicolas2的答案之后,使用inner_join ,我決定嘗試merge 但是要做到這一點,我將需要外部包裝reshape2 melt功能。

df2 <- data.frame(id, question = sub("val", "q", question))
df3 <- reshape2::melt(df, id.vars = "id")
names(df3)[2] <- "question"
result2 <- merge(df2, df3)
result2
#   id question value
#1 DYE      q_1     1
#2 DYE      q_3     1
#3 JNF      q_3     2
#4 JNF      q_5     3
#5 LHH      q_4     2
#6 WNB      q_4     2
#7 XEY      q_1     5
#8 XEY      q_3     5

結果是相同的,但行順序不同。

暫無
暫無

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

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