如何解决创建一个函数来汇总当前存储在数据框的两列中的成对“因子” 数据
我有一个大的(> 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)'
我已经编写了以下代码,但是我无法让它接受列名作为函数的输入:
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 举报,一经查实,本站将立刻删除。