R数据帧上的“应用”返回转置的行

时间:2018-09-25 15:01:40

标签: r dataframe apply

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

如果age小于或等于3,我想用字符串var1替换var2legit。否则,该行应留空。

我知道我可以通过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()。另外,我设法丢失了列名。

谢谢

1 个答案:

答案 0 :(得分:1)

您只需使用基数R来df[df$age < 4, c(3,4)] <- "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