2016-09-11 18 views
0

Ich habe gelesen, wie man die Werte in einer Spalte durch die in einer anderen Spalte in R teilen. Aber ich möchte wissen, wie man die Werte in mehreren Spalten durch die Werte in einer einzelnen Spalte. Auch meine erste Spalte besteht aus Nicht-Numerik. Wie schreibt man ein Skript in R, um all dies zu tun und die nicht-numerische zu vermeiden?Teilen Sie die Werte in einer Spalte durch die in einer anderen Spalte in R

Ich möchte HDL und HDW von SVL in der CSV-doc teilen unter

species SVL  HDL HDW 
PM  26.68 9.27 9.83 
PM  23.46 8.41 8.59 
PM  24.15 8.36 8.1 
PM  23.09 8.91 8.79 
Tioman 31.8 11.65 11.18 
Tioman 29  10.88 10.66 
+0

In „Spezies SVL HDL HDW PM 26.68 9.27 9.83 Uhr 23.46 8.41 8.59 24.15 8.36 8.01 23.09 8.91 8.79 Tioman 31,8 11,65 11,18 Tioman 29 10,88 10,66 ", es gibt keine geraden Zeilenumbrüche – user31264

+1

' df1 [c ("HDW", "HDL")]/df1 $ SVL' – user2957945

+1

@ user2957945 obwohl Ihre ist in Ordnung, ist es häufiger, sie zu verweisen nach Spaltenindex anstelle von Listenindex? 'dat [, c (" HDL "," HDW ")]/dat [," SVL "]' – r2evans

Antwort

0

mag ich das dplyr Paket für dieses Zeug. Wenn Sie Ihre Daten als CSV eingelesen haben, können Sie mit dem Befehl mutate einfach neue Spalten als Funktionen anderer Spalten definieren. z.B.

require(dplyr) 
mydata<-tbl_df(mydata) #Make it into a tbl class 
#Define the new columns 
mydata<-mydata%>% 
    mutate(HDLSVL=HDL/SVL)%>% 
    mutate(HDWSVL=HDW/SVL) 
+0

'mutate_all' könnte das ein bisschen einfacher machen. – thelatemail

+0

Danke - Ich war noch nicht auf mutate_all gestoßen. Sieht so aus, als müsste ich meine Version von dplyr aktualisieren :) – amg

+0

Auch keine Notwendigkeit für zwei 'mutate()' Aufrufe. Kann nur 'mydata%>% sein muate (HDLSVL = HDL/SVL, HDWSVL = HDW/SVL)' –

0

Hier ist eine Option mit data.table. Wir konvertieren den 'data.frame' in 'data.table' (setDT(df1)), spezifizieren die interessierenden Spalten in .SDcols, durchlaufen sie (lapply(..) und teilen (/) mit dem 'SVL'.

library(data.table) 
setDT(df1)[, lapply(.SD, `/`, df1$SVL), .SDcols = HDL:HDW] 

Wenn wir neue Spalten erstellen müssen auf der Grundlage des geteilten Ausgang, dann

setDT(df1)[, paste0(names(df1)[3:4],"_SVL") := lapply(.SD, `/`, df1$SVL), .SDcols = HDL:HDW] 
Verwandte Themen