【问题标题】:Adding elements of tables or arrays of tables to a dataframe in R将表或表数组的元素添加到 R 中的数据框
【发布时间】:2021-01-21 13:24:40
【问题描述】:

我想知道如何在下面的代码中将fpctable 对象)的元素作为新列添加到out 的相关行中?

out 的相关行是指与fpc 表名匹配的行。例如,对于out 中存在FHigh 的所有行,fpc 将是0.02027469

或者对于out 中存在MMedium 的所有行,fpc 将是0.01984979,依此类推。

这在 R 中可能吗?

注意:这是一个玩具数据。 fpc 也可以是一个表数组(见下文)。因此,功能性解决方案值得赞赏。

d <- read.csv('https://raw.githubusercontent.com/rnorouzian/d/master/su.csv')

out <- read.csv('https://raw.githubusercontent.com/rnorouzian/d/master/out.csv')

vars <- c("gender", "pre")

tt1 <- table(d[vars])

tt2 <- table(out[vars])

( fpc <- tt2/tt1 )

     pre
gender       High        Low     Medium
     F 0.02027469 0.01974522 0.02009274
     M 0.02014295 0.01991008 0.01984979


########## PLEASE NOTE: `fpc` could be an array of tables as shown below:

vars <- c("gender", "pre", "sector")

tt11 <- table(d[vars])

tt22 <- table(out[vars])

( fpc2 <- tt22/tt11 )

【问题讨论】:

    标签: r function dataframe dplyr tidyverse


    【解决方案1】:

    也许您正在寻找这个(我不清楚您将什么称为数组?它是不同fcp 数据帧的列表吗?):

    library(tidyverse)
    #Data
    d <- read.csv('https://raw.githubusercontent.com/rnorouzian/d/master/su.csv')
    
    out <- read.csv('https://raw.githubusercontent.com/rnorouzian/d/master/out.csv')
    
    tt1 <- table(d[c("gender", "pre")])
    
    tt2 <- table(out[c("gender", "pre")])
    
    #Keys
    fpc <- as.data.frame.matrix(tt2/tt1)
    #Code
    out2 <- out %>% left_join(fpc %>% rownames_to_column('gender') %>%
      pivot_longer(-gender) %>% rename(pre=name))
    

    输出:

    head(out2)
      no. fake.name  sector pretest state gender  pre          email       phone      value
    1   1      Pont Private    1352    NY      F High    Pont@...com xxx-xx-6216 0.02027469
    2   2    Street     NGO    1438    CA      F High  Street@...com xxx-xx-6405 0.02027469
    3   3    Galvan Private    1389    NY      F High  Galvan@...com xxx-xx-9195 0.02027469
    4   4    Gorman     NGO    1375    CA      F High  Gorman@...com xxx-xx-1845 0.02027469
    5   5   Jacinto Private    1386    CA      F High Jacinto@...com xxx-xx-6237 0.02027469
    6   6      Shah  Public    1384    CA      F High    Shah@...com xxx-xx-5723 0.02027469
    

    对于数组中的多个表,我建议使用数据框来获得与table() 相同的结果:

    #Multiple tables
    k1 <- d %>% group_by(sector,gender,pre) %>% summarise(N=n())
    k2 <- out %>% group_by(sector,gender,pre) %>% summarise(N1=n())
    k3 <- k1 %>% left_join(k2) %>% mutate(Value=N1/N) %>% select(-c(N,N1))
    #Code
    out3 <- out %>% left_join(k3)
    

    输出:

    head(out3)
      no. fake.name  sector pretest state gender  pre          email       phone      Value
    1   1      Pont Private    1352    NY      F High    Pont@...com xxx-xx-6216 0.01666667
    2   2    Street     NGO    1438    CA      F High  Street@...com xxx-xx-6405 0.02236422
    3   3    Galvan Private    1389    NY      F High  Galvan@...com xxx-xx-9195 0.01666667
    4   4    Gorman     NGO    1375    CA      F High  Gorman@...com xxx-xx-1845 0.02236422
    5   5   Jacinto Private    1386    CA      F High Jacinto@...com xxx-xx-6237 0.01666667
    6   6      Shah  Public    1384    CA      F High    Shah@...com xxx-xx-5723 0.01067616
    

    拥有数据框然后合并它们更实用。

    【讨论】:

    • 我添加了一个更新,它可能是您根据所需级别和变量用全局数据框替换数组表并最终合并的选项。希望对您有所帮助!
    【解决方案2】:

    在这里,我们只需要用as.data.frametable 强制转换为data.frame,它也适用于2d 和3d 数组

    out1 <- merge(out, as.data.frame(fpc2), all.x = TRUE)
    names(out1)[names(out1)== "Freq"] <- "fpc"
    

    有了更新的案例

     l1 <- length(dimnames(fpc))
     nm1 <- names(dimnames(fpc))
     if(l1 == 1 &&  nm1 == "") {
          names(dimnames(fpc)) <- "cname" # change here
       }
    

    现在,我们执行merge

    out2 <- merge(out, as.data.frame(fpc))
    identical(nrow(out2), nrow(out))
    #[1] TRUE
    

    【讨论】:

    • 评论不用于扩展讨论;这个对话是moved to chat
    • @rnorouzian 不确定。任何开发的代码都会有一些错误。当我们遇到错误时,开发的包会随着新功能和更正错误而增加版本。
    猜你喜欢
    • 2018-05-05
    • 2022-07-05
    • 2022-07-06
    • 2020-05-22
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    相关资源
    最近更新 更多