Ich versuche, eine Zeile in data.table
anwenden und kann es nicht funktionieren. Wie mache ich das?Zeile gelten in data.table mit Spaltennummer Referenzen
library(data.table)
data(diamonds, package= "ggplot2")
dt <- data.table(diamonds)
# what I want, but via data.table
diamonds$sum1 <- apply(dt[,5:10, with=FALSE], 1, sum)
diamonds$sd1 <- apply(dt[,5:10, with=FALSE], 1, sd)
# why don't these work?
dt[, `:=` (sum1= sum(.SD),
sd1= sd(.SD)), .SDcols= 5:10, by= .EACHI]
dt[, `:=` (sum1= sum(dt[,5:10, with=FALSE]),
sd1= sd(dt[,5:10, with=FALSE])), by= .EACHI]
Beide geben diesen Fehler:
Error in
[.data.table
(dt, ,:=
(sum1 = sum(.SD), sd1 = sd(.SD)), .SDcols = 5:10, : object 'f__' not found
verwandt, aber nicht die gleichen Fragen: (1), (2)
Es gibt eine FR irgendwo für 'by = .EACHI' zu tun, was Sie wollen, aber im Moment hat es nur Bedeutung beim Beitritt. Verwenden Sie 'by = 1: nrow (dt)' anstatt, wenn Sie müssen, aber vermeiden Sie es offensichtlich um jeden Preis. – eddi
Probieren Sie es aus, im Allgemeinen zu vermeiden. Sie können einfach mit 'melt' in ein langes Format konvertieren und dann in einer einzigen Spalte arbeiten. Oder Sie könnten 'rowMeans' verwenden oder die' matrixStats' auschecken, die viele andere vektorisierte Zeilenoperationen haben. Oder schreiben Sie [Ihre eigene] (http://stackoverflow.com/a/25100036/3001626) vektorisierte Funktion. Oder benutze Rcpp. Meiner Ansicht nach ist R eine Sprache, die Sie immer wieder mit intelligenten Tricks ausstatten müssen, um Ihre Probleme effizient zu lösen, und zwar so, wie es auf der ersten Seite am sinnvollsten ist. –
@DavidArenburg Fair genug Punkte. Aber die Dev-Zeit, um dies in Rcpp zu schreiben, ist es nicht wert, wenn ich nur das 'data.frame'-Framework verwenden kann –