我有一个如下所示的数据框:
@IBAction func btnFBLoginPressed(sender: AnyObject) {
let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()
fbLoginManager.logInWithReadPermissions(["email"], fromViewController: self, handler:{ (result, error) -> Void in
if ((error) == nil) {
//Show Alert Error Describing any message
}
else if result.isCancelled {
print("result cancel")
}
else {
let fbloginresult : FBSDKLoginManagerLoginResult = result
if(fbloginresult.grantedPermissions.contains("email"))
{
self.getFBUserData()
fbLoginManager.logOut()
}
}
})
}
现在我想通过一个函数运行我的数据帧来处理5个值。
所以喜欢
x <- c(1,2,3)
y <- c(4,5,5)
df <- data.frame(x,y)
现在这个有效。但是当我之后调用我的数据帧df后,我又回来了:
getRidOdNAs <- function(df){
for (i in 1:nrow(df)){
if(df$y[i] == 5){
df$y[i] <- 0
}
}
return(df)
}
有什么想法我应该这样做,以便取回更改的数据框?
答案 0 :(得分:3)
请注意,getRidOdNAs
不会修改输入df
,而是输出一个新数据框,该数据框是输入的修改版本。必须将该输出分配给变量,否则它将丢失。使用问题中的函数运行此代码确实有效:
df.orig <- df # make a copy of df and store it in df.orig
df2 <- getRidOdNAs(df)
df2 # df2 is indeed a modified version of the input, df
## x y
## 1 1 4
## 2 2 0
## 3 3 0
identical(df.orig, df) # df unchanged
## [1] TRUE
请注意,这也有效:
df3 <- transform(df, y = replace(y, y == 5, 0))
identical(df2, df3) # check that df2 and df3 are identical
## [1] TRUE
就像这样:
df4 <- df # make a copy so we can avoid overwriting df
df4$y[df4$y == 5] <- 0 # overwrite df4
identical(df4, df2) # df4 is same as df2
## [1] TRUE