创建函数来读取数据集和列并显示nrow

时间:2015-04-19 18:40:47

标签: r dataframe

我正在努力解决一个可能相当简单的任务。我想创建一个函数,它具有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语言的新手。所以,请帮助我。

2 个答案:

答案 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