【问题标题】:Applying functions to conditional rows with output in new column in R将函数应用于条件行,并在 R 的新列中输出
【发布时间】:2020-05-20 10:56:33
【问题描述】:

我有大约 700 个观察值的 df,其中我创建了三个不同的 functions 来使用三种不同的方法计算距离。我想根据条件语句每行运行三个函数之一。我有点像 R 菜鸟,所以到目前为止我所做的是在 for 循环中使用 if 语句。

我想做什么:

sightings <- data.frame(a=c(NA, 1, NA, 1, NA, 1), b=c(NA, NA, "HO", "HO", "LA", "LA"), 
                        c=c(100, 200, 300, 400, 500, 600), d = c(NA, NA, NA, NA, NA, NA))
#our df 

> sightings
   a    b   c  d
1 NA <NA> 100 NA
2  1 <NA> 200 NA
3 NA   HO 300 NA
4  1   HO 400 NA
5 NA   LA 500 NA
6  1   LA 600 NA

#desired output
   a    b   c   d
1 NA <NA> 100 100
2  1 <NA> 200 200
3 NA   HO 300 300
4  1   HO 400 467
5 NA   LA 500 500
6  1   LA 600 666

我有两个functions:一个用于使用df$b == "HO"df$d 中生成距离,另一个用于df$b == "LA"(两者都包括多个三角函数,包括此处未提及的列中的值)。

所以在df$b == "HO" &amp; df$a != NA 我想运行ho.function,输出在df$ddf$b == "LA" &amp; df$a != NA 运行la.functiondf$d 输出的情况下

我设计了一个if 语句,我尝试将它放入for 循环,但没有成功(for 循环和if 语句都是新的)

for(i in 1:nrow(df)){
  if(df$b[i] == "LA" && is.na(df$a) == FALSE){
    df$d <- la.function 
  } else if (df$b[i] == "HO" && is.na(df$a) == FALSE){
    df$d <- ho.function
  } else {
    df$d <- df$c
  }
}

问题是我不断收到df$d == df$c &gt; TRUE,所以感觉就像 R 只是跳过了我的前两个 if 语句?

任何对此有任何知识/经验的人?我是否正确使用了这些功能?

【问题讨论】:

  • la.functionho.function 的输入是什么?
  • 可能将is.na(df$a) 更改为is.na(df$a[i])df$d 更改为df$d[i]
  • 输入是另一列的弧度(ho.function),la.function 的弧度和距离。我在不同的参数中添加了[i],但仍然没有
  • 您需要使此示例可重现,您已共享数据但不清楚如何应用la.function 以及它返回的输出是什么。您只是将la.function 分配给df$d。就像分配函数 mean 一样,除非你像 mean(1:10) 那样传递一些值给它,否则没有任何意义。

标签: r loops dataframe if-statement


【解决方案1】:

我们不知道la.functionho.function 的详细信息以及它们是否被矢量化。所以保持代码简单,我们可以使用for循环:

for(i in 1:nrow(sightings)) {
  if(sightings$b[i] == "LA" && !is.na(sightings$a[i])) {
    sightings$d[i] <- la.function(sightings$c[i]) 
  } else if (sightings$b[i] == "HO" && !is.na(sightings$a[i])){
    sightings$d[i] <- ho.function(sightings$c[i])
  } else {
    df$d[i] <- df$c[i]
  }
}

使用[i] 对数据进行子集化以更新特定行而不是整列非常重要。

【讨论】:

    猜你喜欢
    • 2015-03-15
    • 2020-05-06
    • 1970-01-01
    • 2020-12-09
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    相关资源
    最近更新 更多