2016-11-11 2 views
1

Ich habe einen Datenrahmen, der die Nummern und die Zahlen enthält, die durch "." Getrennt werden und ich möchte die Einträge ändern, die von "." Zeichenfolge. Wenn der Eintrag kein "." das Präfix "-" sollte hinzugefügt werden. Das ist ziemlich einfach mit der Subsetting- oder Grep-Funktionalität. Aber ich möchte auch die Einträge ersetzen, die ein "." mit dem Zähler von ".".R - ändern Sie Datenrahmeneinträge durch spezifische Zeichenkette (zählen Sie und ersetzen Sie durch den Wert des Zählers, ändern Sie Zeichen)

mein Beispiel Daten:

X1  X2 
1  2 
3  4 
6  8 
5  1.2 
3.4  7 
1.2.5 9 
11  3.4.7 

und ich möchte es so aussehen haben:

X1  X2 
-1  -2 
-3  -4 
-6  -8 
-5  1 
2  -7 
3  -9 
-11  4 

Ich habe keine Ahnung und habe bereits versucht subsetting, Extrahieren der "" Teile, um sie zu zählen. Aber ich kann den Zähler nicht einfügen. Danke für Ihre Hilfe.

+0

weil es t ist das dritte und vierte Mal ein "." erscheint – Miguel123

+0

Ja, ich habe es. Schau dir meine Antwort an unter – Sotos

+0

ja, danke! :) Auch eine nette Lösung, obwohl ich mit Sapply nicht vertraut bin. Und je nach Ihrer Frage - wie würde der Code aussehen, wenn wir die Nummern des "." - Eintrags überprüfen und durch die Zeilennummer ersetzen wollen, wo die Kombination oben erschien? Das heißt also: 1.2. => 1, 3.4 => 2, 1.2.5 => 4, 3.4.7 => 5? – Miguel123

Antwort

2

Hier eine Idee, über die Basis R,

ind <- rowSums(sapply(df, function(i) cumsum(grepl('\\.', i)))) 
df[] <- lapply(df[], function(i) ifelse(grepl('\\.', i), ind, paste0('-', i))) 

df 
# X1 X2 
#1 -1 -2 
#2 -3 -4 
#3 -6 -8 
#4 -5 1 
#5 2 -7 
#6 3 -9 
#7 -11 4 

HINWEIS: ich umgewandelt df char acter,

df[] <- lapply(df[], as.character) 

EDIT

In Bezug auf Ihre Anfrage Zeilennummern, tun dies sollte dann,

ind1 <- apply(df, 1, function(i) paste(sort(i), collapse = '.')) 
df2 <- sapply(df, function(i) match(i, ind1)) 
df[] <- lapply(df[], function(i) ifelse(grepl('\\.', i), 0, paste0('-', i))) 
df[!is.na(df2)] <- df2[!is.na(df2)] 
df 
# X1 X2 
#1 -1 -2 
#2 -3 -4 
#3 -6 -8 
#4 -5 1 
#5 2 -7 
#6 4 -9 
#7 -11 5 

Wenn Sie tun Berechnungen mit diesem Datenrahmen, später planen dann Sie sollten in Ganzzahl umwandeln, dh

0

Hier wird mit data.table Die Idee ist, einen Zähler in einer temporären Spalte zu erstellen:

library(data.table) 

dt<-data.table(df) 
dt$X1 <- as.character(dt$X1) 
dt$X2 <- as.character(dt$X2) 
dt[!grepl(".", dt$X1, fixed=TRUE),X1:=paste("-", X1, sep="") ] 
dt[!grepl(".", dt$X2, fixed=TRUE),X2:=paste("-", X2, sep="") ] 
dt[grepl(".", dt$X1, fixed=TRUE)|grepl(".", dt$X2, fixed=TRUE), count_point:=as.character(sequence(.N))] 
dt[grepl(".", dt$X1, fixed=TRUE),X1:=count_point] 
dt[grepl(".", dt$X2, fixed=TRUE),X2:=count_point] 
df <- data.frame(dt[, c("X1", "X2"), with = FALSE]) 

Es soll eine Möglichkeit, es in weniger Linie zu tun, mit .SD

+0

wow, das funktioniert. habe nie über eine temporäre Kolumne nachgedacht ... – Miguel123

Verwandte Themen