我想使用带有自定义函数的apply替换数据框中的值。
如果age
小于或等于3,我想用字符串var1
替换var2
和legit
。否则,该行应留空。
我知道我可以通过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()
。另外,我设法丢失了列名。
谢谢
答案 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