列字符类型的数据框不适用于rbind

时间:2017-10-31 02:32:48

标签: r

我试图实例化一个数据框,然后在其中插入行。其中一列将包含字符串。我将字符串视为因素存在问题,然后当出现新字符串时,R会插入NA。所以我不得不使用以下解决方法:

df = data.frame(x = character(3), stringsAsFactors = F)
df = rbind(df, c('foo'))
df = rbind(df, c('bar'))
df
#    x
#1    
#2    
#3    
#4 foo
#5 bar
然而,它并不好,因为我不想要空行。但是以下方法不起作用:

df = data.frame(x = character(0), stringsAsFactors = F)
df = rbind(df, c('foo'))
df = rbind(df, c('bar'))
#Warning message:
#In `[<-.factor`(`*tmp*`, ri, value = "bar") :
#  invalid factor level, NA generated

我知道我可以使用df[i, ] = c(...),但我不想跟踪索引。

4 个答案:

答案 0 :(得分:3)

使用list

rbind(df, list(x=c("foo","bar")))
#    x
#1 foo
#2 bar

答案 1 :(得分:2)

默认情况下,

rbindstringsAsFactors=TRUE。因此,请使用stringsAsFactors=FALSE以避免转换为factor

根据?rbind

  

rbind(...,deparse.level = 1,make.row.names = TRUE,         stringsAsFactors = default.stringsAsFactors())

df <- rbind(df, list(x='foo'), stringsAsFactors= FALSE)
df <- rbind(df, list(x = 'bar'), stringsAsFactors = FALSE)
df
#   x
#1 foo
#2 bar

str(df)
#'data.frame':   2 obs. of  1 variable:
# $ x: chr  "foo" "bar"

我们也可以在stringsAsFactors中更改options,而不是重复使用data.frame

这里我们假设OP想要按顺序添加行,并根据OP character('df')的初始化,列类将是def reconstruct_path(came_from, start, goal): current = goal path = [current] while current != start: current = came_from[current] path.append(current) path.reverse() # optional return path class

答案 2 :(得分:1)

确保使用rbind加入具有相同列名的data.frames

df = data.frame(x = character(0), stringsAsFactors = FALSE)
df = rbind(df, data.frame(x = c('foo')))
df = rbind(df, data.frame(x = c('bar')))
df
#    x
#1 foo
#2 bar

答案 3 :(得分:0)

采用func ImageFromUrl(imageView:UIImageView,url:String,type:String) { if url.isEmpty { imageView.image = #imageLiteral(resourceName: "defaultIcon") print("Url is empty.") return } var documentsDirectoryURL:URL if type == "user" { documentsDirectoryURL = try! FileManager().url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("Image/User/") let exist = FileManager.default.fileExists(atPath: documentsDirectoryURL.path) if !exist { do { try FileManager.default.createDirectory(atPath: documentsDirectoryURL.path, withIntermediateDirectories: true, attributes: nil) } catch let error as NSError { debug(object: error) } } } // create a name for your image let fileName = url.md5() let fileURL = documentsDirectoryURL.appendingPathComponent(fileName) let urlString = URL(string: url) if let image = UIImage(contentsOfFile: fileURL.path) { imageView.image = image return } DispatchQueue.global().async { let data = try? Data(contentsOf: urlString!) //make sure your image in this url does exist, otherwise unwrap in a if let check / try-catch if data != nil { if let image = UIImage(data: data!) { if !FileManager.default.fileExists(atPath: fileURL.path) { var c = [UInt32](repeating: 0, count: 1) (data! as NSData).getBytes(&c, length: 1) switch (c[0]) { case 0xFF: print("Download jpg: \(url)") if let jpegData = UIImageJPEGRepresentation(image, 0.5) { do { try jpegData.write(to: fileURL, options: .atomic) } catch { debug(object: error) } } case 0x89: print("Download png: \(url)") if let pngData = UIImagePNGRepresentation(image) { do { try pngData.write(to: fileURL, options: .atomic) } catch { debug(object: error) } } case 0x47: print("Download gif: \(url)") default: print("Download unknown: \(c[0])\(url)") } } else { // debug(object:"file already exists") } DispatchQueue.main.async { imageView.image = image } } } } } func GeneratorAvatarImageView() -> UIImageView { let imageview = UIImageView() imageview.layer.masksToBounds = true imageview.layer.cornerRadius = 2 imageview.backgroundColor = UIColor.clear imageview.contentMode = UIViewContentMode.scaleAspectFill return imageview } 方法

tidy