簡體   English   中英

從 r 中的同名列中獲取數據

[英]Grabbing data from columns with same name in r

我目前有 2 個數據框

df1=data.frame(q1 = c(1:3),
               q2 = c("One" , "Two" , "Three") , 
               q3 = c(100,231,523),
               q4 = c("red", "green", "blue"),
               q1.2 = c(20:22),
               q2.2 = c("Six" , "Ten" , "Twenty") , 
               q3.2 = c(5,900,121),
               q4.2 = c("purple", "yellow", "white"))
df2=data.frame(x1 = c("q1" , "q2.1" , "q3.2" , "q4.2") ,
               x2 = c("q2" , "q3" , "q3.3" , "q4.4") ,
               x3 = c("q3" , "q2.4" , "q3.3" , "q4.6"), 
               x4 = c("q4" , "q3.6" , "q3.3" , "q4.2"))

我需要創建 4 個不同的表。 這些表的標題是包含在 df2 中的每一行,而觀察值必須從 df1 中獲得。 正如您所注意到的,df2 中包含的某些標頭在 df1 中不存在。 我希望我的 4 個表包含所有 4 個標題(無論它們是否存在),如果不存在,則其數據應為空白。

我目前正在使用此代碼

for (i in 1:nrow(df2)) {
  colnames(df2)<- df2[i,]
  tabla_temp = df1[intersect(names(df1), names(df2))]
  tname <- paste0("tabla_", i)
  assign(tname, tabla_temp)
  rm(tabla_temp)
}

我讓我的循環正常工作,但我得到了具有不同列數的表(只有那些存在於 df1 中的表)。

知道如何讓我的循環創建具有不存在標題的相同大小的表來代替空白 obs 嗎?

lapply(df2, function(x) {
  merge(
    df1[names(df1) %in% levels(x)],
    read.table(text = "", col.names = levels(x)), all = T)
})

$x1
  q1 q3.2   q4.2 q2.1
1  1    5 purple   NA
2  2  900 yellow   NA
3  3  121  white   NA

$x2
     q2  q3 q3.3 q4.4
1   One 100   NA   NA
2 Three 523   NA   NA
3   Two 231   NA   NA

$x3
   q3 q2.4 q3.3 q4.6
1 100   NA   NA   NA
2 231   NA   NA   NA
3 523   NA   NA   NA

$x4
     q4   q4.2 q3.3 q3.6
1  blue  white   NA   NA
2 green yellow   NA   NA
3   red purple   NA   NA

數據

df1=data.frame(q1 = c(1:3),
               q2 = c("One" , "Two" , "Three") , 
               q3 = c(100,231,523),
               q4 = c("red", "green", "blue"),
               q1.2 = c(20:22),
               q2.2 = c("Six" , "Ten" , "Twenty") , 
               q3.2 = c(5,900,121),
               q4.2 = c("purple", "yellow", "white"))

df2=data.frame(x1 = c("q1" , "q2.1" , "q3.2" , "q4.2") ,
               x2 = c("q2" , "q3" , "q3.3" , "q4.4") ,
               x3 = c("q3" , "q2.4" , "q3.3" , "q4.6"), 
               x4 = c("q4" , "q3.6" , "q3.3" , "q4.2"))

您可以使用 dplyr 中的any_of() function 來完成。 它選擇與名稱匹配的變量並忽略那些不匹配的變量。 我將使用一個列表來存儲循環中的矩陣。 可以使用df_modified[[i]]訪問它們。

# Loading libraries
library(tidyverse)

df_modified = list()
for(i in 1:nrow(df2))
{
   vars = as.character(df2[i,])
   df_modified[[i]] = df1 %>% 
      select(any_of(vars))
}

Output

> df_modified
[[1]]
  q1    q2  q3    q4
1  1   One 100   red
2  2   Two 231 green
3  3 Three 523  blue

[[2]]
   q3
1 100
2 231
3 523

[[3]]
  q3.2
1    5
2  900
3  121

[[4]]
    q4.2
1 purple
2 yellow
3  white

暫無
暫無

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

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