如何有条件地调用R中每一行的函数?

时间:2016-04-06 17:03:09

标签: r function if-statement conditional

我正在尝试调用一个为表中的特定数据元素提供值的函数。

数据表(gameData)可能是:

DECIMAL

如果是NaN,我想用函数的返回来填充TeamAScore。我尝试了以下功能:

            Date TeamA TeamB TeamAScore TeamBScore
    1 2016-03-06   NYC   HOU         67         76
    2 2016-02-14   BOS   SEA        NaN        NaN
    3 2016-01-30   LAS   DAL         63         74

当我运行时,我收到如下错误:

  

Ops.factor中的错误(teamdata $ Team,TeamA):     等级因子是不同的

它似乎是通过函数调用发送所有TeamA,而不是仅发送该行的值。

1 个答案:

答案 0 :(得分:1)

这里的问题是TeamA和TeamB列没有您认为他们拥有的数据。 R中的因素很棘手......

让我们在这里创建两个因素来看看发生了什么:

> TeamA <- factor(c("NYC", "BOS", "LAS", "SEA"))
> TeamB <- factor(c("HOU", "LAS", "NYC", "SEA"))
> TeamA
[1] NYC BOS LAS SEA
Levels: BOS LAS NYC SEA

好的,所以TeamA有四个位置:NYC,BOS,LAS和SEA。所以我们可以将它与TeamB进行比较,看看两个向量中的任何一个槽是否相同。对?错误:

> TeamA == TeamB
Error in Ops.factor(TeamA, TeamB) : level sets of factors are different

这是你收到的同样错误!之所以会发生这种情况,因为真正存储在此向量中的是表示每个“因子级别”的数字。

> str(TeamA)
 Factor w/ 4 levels "BOS","LAS","NYC",..: 3 1 2 4
> levels(TeamA)
 [1] "BOS" "LAS" "NYC" "SEA"
> levels(TeamB)
 [1] "HOU" "LAS" "NYC" "SEA"

因此,1代表TeamA向量中的BOS,但它代表TeamB向量中的HOU。当然他们无法比较!

如何避免在妨碍使用时使用因素?在创建data.frame时使用参数stringsAsFactors=FALSE(使用data.frame(x, y, z, stringsAsFactors=FALSE)或read.csv(“filename.csv”等等,stringsAsFactors = FALSE)`。