数组乘法的条件if循环 - R.

时间:2016-08-19 14:34:54

标签: arrays r loops if-statement dataframe

我试图将数组乘以某个值。该数组包含日期,因此我想排除它们。我想使用if循环。我知道还有其他方法。

数据:

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
}

它正在选择我想要的列的名称,我认为它是多个而不是数据本身。

2 个答案:

答案 0 :(得分: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不是循环):

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

同样,W列应为numeric

答案 1 :(得分:2)

在R中执行简单循环的常用方法是使用foo="foo" bar="bar" foo="foo" bar="bar" 。我们可以首先以编程方式识别要选择的列:

sapply()

此逻辑向量将用于data.frame的子集化。可能还需要考虑条目可能存储为因子。为了执行乘法,它们应该被转换为数字形式,这是通过首先将条目强制转换为字符而获得的。

因此,这应该有效:

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

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

正如@akrun所指出的,我们可以在这里使用for (i in which(idx)) df[[i]] <- as.numeric(as.character(df[[i]])) * 0.0254 代替lapply()。在这种情况下,结果将是相同的。帮助页面sapply()的描述部分总结了这两个功能之间的差异:

  

'sapply'是一个用户友好的版本和'lapply'的包装        默认返回一个向量,矩阵,如果'simplify =“array”',则为        数组(如果适用),应用'simplify2array()'。 “sapply(X,        f,simplify = FALSE,USE.NAMES = FALSE)'与'lapply(x,        F)”