R:根据矩阵的列分配变量名称

时间:2013-08-28 13:11:24

标签: r

我是R的(非常)新用户,并尝试在此处复制我的MATLAB代码(在此阶段更喜欢R到Octave)。

我有以下矩阵df

variable value
th   100
tw   100
gap  30

我希望能够根据第一列将变量分配给第二列中的值。基本上,th = 100tw = 100gap = 30

我的最终目标是能够以下列方式操纵数据:

difference <- th-gap

编辑:

>dput(df)
structure(list(s = structure(1:3, .Label = c("aa", "bb", "cc" ), class = "factor"),
n = c(2, 3, 5)), .Names = c("s", "n"), row.names = c(NA, -3L), class = "data.frame")

2 个答案:

答案 0 :(得分:0)

使用

Vectorize(assign, c("x", "value"))(as.character(M[,1]), M[,2], envir=globalenv())

其中M是您的矩阵或数据框。请注意,as.character确保在分配之前将因子转换为字符串。

如果M是包含第二列中数字的字符矩阵,那么您可以使用as.numeric(M[,2])代替M[,2]

但老实说,这不是最好的方法。使用assign通常是不受欢迎的,因为它不直观并导致代码不太可读。

您可以创建一个列表:

L <- as.list(M[,2])
names(L) <- M[,1]

然后按照L[["th"]]中的名称访问您的数据。

答案 1 :(得分:0)

你几乎肯定有一个data.frame,它与matrix完全不同。 matrix是一个原子向量,其维度属性将其包装为matrix。由于它实际上只是一个原子向量,因此矩阵只能包含单一类型的数据,因此您不能将character数据与numeric数据混合在一起。另一方面,data.frame是一种列表,其中每个列表元素是相同长度的原子向量(长度给出行数,列表中元素的数量是列数) 。每个list元素都可以保存不同类型的数据。

所以我们假设您有data.frame ...

#  Construct the data
df <- read.table( text = "variable value
th   100
tw   100
gap  30" , h = TRUE )

df
#  variable value
#1       th   100
#2       tw   100
#3      gap    30

#  Subset the data.frame to the values you want using the `[` operator
difference <- df[ df$variable == 'th' , 'value' ] - df[ df$variable == 'gap' , 'value' ]
#[1] 70

我们可以使用data.frame运算符对[进行子集化。 [,]内的第一个参数是行,第二个参数是列。因此[ df$variable == 'th' , 'value' ]TRUE时返回行参数中的variable == 'th'的逻辑向量,并返回满足此条件的所有行value