R数据帧上的“Apply”返回转置行[duplicate]

问题描述 投票:0回答:1

这个问题在这里已有答案:

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

如果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()。此外,我设法失去了列名。

谢谢

r dataframe apply
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.