我有以下日期:
var1 <- c("a", "b", "c", "d", "e")
我有一个函数可以为每个var1值分配一个数字分数(0-3)。
f(a) --> 2
f(b) --> 1
etc...
我想使用apply like函数来获取包含2列的数据框: var1和得分:
var1 score
a 1
b 0
c 3
d 3
e 2
f 1
我曾尝试使用vapply和map_dfr,但它不像我所示的那样工作。 请告知如何做到这一点。
P.S
For map_dfr: Error: cannot convert object to a data frame
答案 0 :(得分:3)
从akrun的解决方案中获得帮助,这更简单
f <- function(x) sample(0:3, 1)
var1 <- c("a", "b", "c", "d", "e")
data.frame(cbind(Var1 = var1, Score = lapply(var1,f)))
Var1 Score
1 a 0
2 b 2
3 c 0
4 d 1
5 e 3
答案 1 :(得分:2)
将矢量转换为data.frame
,然后使用sapply创建新矢量。
df1 <- as.data.frame(var1)
df1$test <- sapply(df1$var1, function(x) if (x=="a") 1 else 0)
var1 test
1 a 1
2 b 0
3 c 0
4 d 0
5 e 0
str(df1)
'data.frame': 5 obs. of 2 variables:
$ var1: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
$ test: num 1 0 0 0 0
答案 2 :(得分:2)
我们可以遍历vector
('var1')应用函数(f
)来获取list
vector
,设置vector
的名称1}}使用'var1'并使用stack
将其转换为2列data.frame
stack(setNames(lapply(var1, f), var1))[2:1]
默认情况下,stack
会将列名称返回为“ind”和“values”。我们可以将其更改为“var1”和“score”
setNames(stack(setNames(lapply(var1, f), var1))[2:1], c('var1', 'score'))
f <- function(x) sample(0:3, 1)
var1 <- c("a", "b", "c", "d", "e")