2016-08-19 61 views
1

我想將數組乘以某個值。該數組包含日期,因此我想排除它們。我想使用if循環。我知道還有其他的方法。有條件的如果循環用於數組乘法 - R

數據:

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環路不工作:

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

它選擇我想要的列的名稱,我認爲它的復接的,而不是數據本身。

+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是否T A環):

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的子集。人們可能還需要考慮這些條目可能被存儲爲因素。爲了執行乘法,它們應該被轉換成數字形式,這是通過首先將條目強制轉換爲字符而獲得的。

所以這應該工作:

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循環,如:

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

正如@akrun我們可以使用中指出lapply()而不是sapply()這裏。在這種情況下,結果將是相同的。幫助頁面?lapply的描述部分總結了這兩個功能之間的區別:

「sapply」是 默認的「lapply」用戶友好界面和包裝返回一個向量,矩陣,或者,如果「簡化=「array」', 數組,如果適用的話,應用'simplify2array()'。 'sapply(x, f,simplify = FALSE,USE.NAMES = FALSE)'與'lapply(x, f)'相同。