我正在努力解决一个可能相当简单的任务。我想创建一个函数,它具有dataframe(df)的参数,dataframe(T和R)的列名,所选数据帧列(a和b)的值。我知道该函数读取数据帧。但是,我不知道如何选择列。我收到了错误。
fun <- function(df,T,a,R,b)
{
col <- ds[c("x","y")]
omit <- na.omit(col)
data1 <- omit[omit$x == 'a',]
data2 <- omit[omit$x == 'b',]
nrow(data2)/nrow(data1)
}
fun(jugs,Place,UK,Price,10)
我是r语言的新手。所以,请帮助我。
答案 0 :(得分:0)
您正在制作一些错误。
col <- ds[c("x","y")]
x和y是什么?大概他们是你传递的论据,但你在你的函数中指定了T和R,而不是x和y。
data1 <- omit[omit$x == 'a',]
data2 <- omit[omit$x == 'b',]
同样,大概,你想要a和b成为你传递给函数的参数,但是你指定了&#39; a&#39;和&#39; b&#39;这是具体的,而不是一般的论点。另外,我假设第二个&#34;省略$ x&#34;应该&#34;省略$ y&#34; (或相反亦然)。实际上,由于您刚刚将其转换为具有两列的新数据框,因此您只需使用列索引。
nrow(data2)/nrow(data1)
您应该打印此行,或将其返回。任何一个都应该足够了。
fun(jugs,Place,UK,Price,10)
最后,你应该在Place,UK和Price上使用引号,至少我已经这样做了。
fun <- function(df, col1, val1, col2, val2){
new_cols <- df[,c(col1, col2)]
omit <- na.omit(new_cols)
data1 <- omit[omit[,1] == val1,]
data2 <- omit[omit[,2] == val2,]
print(nrow(data2)/nrow(data1))
}
fun(jugs, "Place", "UK", "Price", 10)
如果我了解您尝试做什么,可能更容易避免创建您不需要的多个数据框,而只是使用计数。
fun <- function(df, col1, val1, col2, val2){
new_cols <- df[,c(col1, col2)]
omit <- na.omit(new_cols)
n1 <- sum(omit[,1] == val1)
n2 <- sum(omit[,2] == val2)
print(n2/n1)
}
fun(jugs, "Place", "UK", "Price", 10)
答案 1 :(得分:0)
我会按如下方式编写此函数:
fun <- function(df,T,a,R,b) {
data <- na.omit(df[c(T,R)]);
sum(data[[R]]==b)/sum(data[[T]]==a);
};
正如您所看到的,您可以将前两行合并为一行,因为在您的代码中col
未在任何地方重复使用。其次,既然你只关心中间data.frame的两个子集的行数,你实际上并不需要构造那两个data.frames;相反,您可以只计算两次比较产生的逻辑向量,然后在这些逻辑向量上调用sum()
,这会自然地将FALSE
视为0,将TRUE
视为1。
演示:
fun <- function(df,T,a,R,b) { data <- na.omit(df[c(T,R)]); sum(data[[R]]==b)/sum(data[[T]]==a); };
df <- data.frame(place=c(rep(c('p1','p2'),each=4),NA,NA), price=c(10,10,20,NA,20,20,20,NA,20,20), stringsAsFactors=F );
df;
## place price
## 1 p1 10
## 2 p1 10
## 3 p1 20
## 4 p1 NA
## 5 p2 20
## 6 p2 20
## 7 p2 20
## 8 p2 NA
## 9 <NA> 20
## 10 <NA> 20
fun(df,'place','p1','price',20);
## [1] 1.333333