微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

创建一个函数来汇总当前存储在数据框的两列中的成对“因子” 数据

如何解决创建一个函数来汇总当前存储在数据框的两列中的成对“因子” 数据

我有一个大的(> 200000个观察值)平面文件数据帧,整个数据帧中都有多个“成对”代码。对于每一对,一列包含一个数字代码,第二列是对该代码的描述。我已经将代码和描述都设置为“因素”。

下面是数据框的一个例子

|-------------|---------------|---------------|-------------|---------------|---------  
|      ID     |   Unit_CD     |      Unit     |    Name_CD  |      Name     |     etc  
|-------------|---------------|---------------|-------------|---------------|---------  
|      01     |       12      |      Bob      |      A01    |      EPID     |     etc
|      02     |       10      |      Sue      |      A04    |      UPIM     |     etc
|      03     |       12      |      Bob      |      V03    |      AVRM     |     etc
|      04     |       14      |      Moo      |      A04    |      UPIM     |     etc

我想创建一个函数,您可以在其中输入两个成对的列名,它将返回一个串联的字段,该字段显示如下的数字代码和说明:

'code.names(df,Unit_CD,Unit)'

输出: 单位代码
10:苏
12:鲍勃
14:Mo

我已经编写了以下代码,但是我无法让它接受列名作为函数的输入:

code.names <- function(df,column1,column2){

    n <-count(df,column2)
    CD.V <- as.vector(n[,1])
    CD.Code <- as.vector(n[,2])
    
    
    i <- nrows(n)
    for (i in 1:n){ 
      paste(CD.V[i],CD.Code[i])
    }
}

我得到的错误

 Error: Must group by variables found in `.data`.
* Column `column1` is not found.
* Column `column2` is not found.

由于我在代码中多次执行此操作,因此我希望将其设置为一个函数,但是仍然可以通过任何其他方法达到最终目的。

解决方法

希望下面的代码可以实现您的目标

code.names <- function(df,column1,column2) unique(paste0(df[[column1]],":",df[[column2]]))
,

带有unite

的选项
library(dplyr)
library(tidyr)
df %>% 
    distinct(Unit_CD,Unit) %>%
    unite(New,Unit_CD,Unit,sep=": ")
#      New
#1 12: Bob
#2 10: Sue
#3 14: Moo

数据

df <- structure(list(ID = 1:4,Unit_CD = c(12L,10L,12L,14L),Unit = c("Bob","Sue","Bob","Moo"),Name_CD = c("A01","A04","V03","A04"),Name = c("EPID","UPIM","AVRM","UPIM")),class = "data.frame",row.names = c(NA,-4L))
,

我建议使用一种新功能,即使用您的数据和要串联的列名的方法:

#Data
df <- structure(list(ID = 1:4,-4L))

代码:

#Function
myfun <- function(x,cola,colb)
{
  var <- paste0(x[,cola],': ',x[,colb])
  var <- unique(var)
  var <- data.frame(var)
  return(var)
}
#Apply
myfun(df,'Unit_CD','Unit')

输出:

      var
1 12: Bob
2 10: Sue
3 14: Moo
,

您可以使用duplicated在数据框中仅保留唯一值。

code.names <- function(df,column2) {
  df1 <- df[!duplicated(df[c(column1,column2)]),]
  cat(paste(df1[[column1]],df1[[column2]],sep = ":",collapse = "\n"))
}

code.names(df,'Unit')

#12:Bob
#10:Sue
#14:Moo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。