我是R的(非常)新用户,并尝试在此处复制我的MATLAB代码(在此阶段更喜欢R到Octave)。
我有以下矩阵df
:
variable value
th 100
tw 100
gap 30
我希望能够根据第一列将变量分配给第二列中的值。基本上,th = 100
,tw = 100
,gap = 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")
答案 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
。