【问题标题】:"Apply" on an R dataframe returns transposed rows [duplicate]R数据帧上的“应用”返回转置行[重复]
【发布时间】:2018-09-25 15:01:39
【问题描述】:

我想使用自定义函数替换我的数据框中的值。

如果age 小于或等于3,我想用字符串legit 替换var1var2。否则,该行应单独保留。

我知道我可以使用 for 循环很容易地做到这一点,但我正在尝试更好地使用 apply()

函数类型可以工作,但返回的数据帧是转置的。这是我的代码:

df = data.frame(id = c(111,222,333,444,555), age = c(6,3,5,6,1), var1 = c(1,NA,2,4,NA), var2 = c(7,NA,5,3,NA))

>df

   id age var1 var2
1 111   6    1    7
2 222   3   NA   NA
3 333   5    2    5
4 444   6    4    3
5 555   1   NA   NA

too_young = function(x)
{
  if(x[[2]] <= 3)
  {

    temp = rep("legit",2)

    temp1 = x[1:2]

    final = (c( temp1,temp))

    return(  final )
  }
  else
  {
    return(x)
  }
}

df1 = apply(df,1,FUN = too_young)

> df1
     [,1]  [,2]    [,3]  [,4]  [,5]   
[1,] "111" "222"   "333" "444" "555"  
[2,] "6"   "3"     "5"   "6"   "1"    
[3,] "1"   "legit" "2"   "4"   "legit"
[4,] "7"   "legit" "5"   "3"   "legit"

如您所见,df1 包含正确的数据,但行和列的方式是错误的。

我可以使用t() 修复它,但在我看来,我从根本上误解了如何在数据帧上使用apply()。另外,我设法丢失了列名。

谢谢

【问题讨论】:

  • with apply using MARGIN as 1,你需要转置
  • 更广泛地说,您真的不应该将apply 与数据框一起使用。 apply 更适合矩阵,或者至少是只有一种数据类型的数据帧。

标签: r dataframe apply


【解决方案1】:

您可以使用基本 R 来执行 df[df$age &lt; 4, c(3,4)] &lt;- "too legit",无需使用 apply 系列中的函数。

df
   id age      var1      var2
1 111   6         1         7
2 222   3 too legit too legit
3 333   5         2         5
4 444   6         4         3
5 555   1 too legit too legit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 2016-11-29
    • 2019-01-16
    • 2020-03-01
    相关资源
    最近更新 更多