2016-08-19 12 views
1

配列に特定の値を掛けようとしています。配列には日付が含まれているため、除外したいと思います。 ifループを使用したいと思います。私は他の方法があることを知っています。配列乗算の条件付きifループ - R

データ:

if(names(df) != "Date"){ 
    df_m <- df*0.0254 
} 

をそれは私がしたい列の名前を選択している、と私はそれがデータそのものではなく、それらをmultiplingと思う:動作しない

Date <- c("2014-12-18","2015-01-16", "2015-01-30") 
W1 <- c("456", "468", "789") 
W2 <- c("456", "468", "789") 
W3 <- c("456", "468", "789") 
df <- data.frame(Date, W1,W2,W3) 
df$Date <- as.Date(df$Date, format="%Y-%m-%d") 

現在ifループ。

+1

最初の列であれば、あなたは 'if(names(df)[1]!= 'Date' {....}' – Sotos

答えて

2

数値にごW列を強制し、その後、それだけである:

df_m <- data.frame(df$Date, df[,-1]*0.0254) 

としてあなたのデータで、すなわち:我々が得る

Date <- c("2014-12-18","2015-01-16", "2015-01-30") 
W1 <- as.numeric(c("456", "468", "789")) 
W2 <- as.numeric(c("456", "468", "789")) 
W3 <- as.numeric(c("456", "468", "789")) 
df <- data.frame(Date, W1,W2,W3) 
df$Date <- as.Date(df$Date, format="%Y-%m-%d") 

df_m <- data.frame(df$Date, df[,-1]*0.0254)  
##  df.Date  W1  W2  W3 
##1 2014-12-18 11.5824 11.5824 11.5824 
##2 2015-01-16 11.8872 11.8872 11.8872 
##3 2015-01-30 20.0406 20.0406 20.0406 

場合あなたはループを使用すると主張してからforループを使用します(つまり、ifはnoです)。ループT):

df_m <- df 
for (i in which(names(df) != "Date")) { 
    df_m[, i] <- df_m[, i] * 0.0254 
} 

再び、W列はnumericであるべきです。

+0

が必要です。私はそれをループで行うことができるかどうか疑問に思っていました。 – squishy

2

Rで単純なループを実行する一般的な方法は、sapply()を使用することです。

idx <- names(df) != "Date" 

この論理ベクトルは、data.frameのサブセット化に使用されます。エントリはおそらく要素として格納されると考える必要があります。乗算を実行するには、最初にエントリを文字に強制することによって得られる数値形式に変換する必要があります。

ので、これは動作するはずです:私たちが使用することができ@akrunで指摘したように

for (i in which(idx)) df[[i]] <- as.numeric(as.character(df[[i]])) * 0.0254 

df[idx] <- sapply(df[idx], function(x) as.numeric(as.character(x))*0.0254) 
#> df 
#  Date  W1  W2  W3 
#1 2014-12-18 11.5824 11.5824 11.5824 
#2 2015-01-16 11.8872 11.8872 11.8872 
#3 2015-01-30 20.0406 20.0406 20.0406 

sapply()とこのサブセットと値の割り当てのようなforループに相当しますsapply()の代わりにlapply()ここに。この場合、結果は同じになります。 「簡素化する場合は、「sapply」のベクトルを返す 、デフォルトでは「lapply」のユーザーフレンドリーなバージョンとラッパーです

マトリックスまたは:ヘルプページ ?lapplyの記述のセクションでは、これらの二つの機能の違いをまとめたもの= "array" '、 配列が必要であれば、' simplify2array() 'を適用します。 'sapply(x、 f、simplify = FALSE、USE.NAMES = FALSE)'は 'lapply(x、 f)'と同じです。