我想这样做
set.seed(667)
df <- data.frame(a = sample(c(c(4,7),11,NA), 10, rep = TRUE),
b = sample(c(1, 2, 3, NA, 5, 6), 10, rep=TRUE),
c = sample(c(11, 12, 13, 14, 15, 16), 10, rep=TRUE))
但不是这样,
df
a b c
1 4 NA 12
2 7 6 12
3 NA NA 14
4 11 1 16
5 NA 2 14
6 NA 3 13
7 11 NA 13
8 NA 6 15
9 7 3 16
10 7 5 16
我想得到的东西,我在某些地方有一个范围,
a b c
1 4-7 NA 12
2 4-7 6 12
3 NA NA 14
4 11 1 16
5 NA 2 14
6 NA 3 13
7 11 NA 13
8 NA 6 15
9 4-7 3 16
10 4-7 5 16
我很困惑,很累,并寻求帮助。
我认为我的问题也可以这样说,我想要这个数据框
data.frame(A = c(4:7, 9),B = c(1,2))
显示为
A B
1 4:7 9
2 2 2
答案 0 :(得分:3)
也许你想要这个?
library(data.table)
d = data.table(A = list(c(4,7), 9),B = c(1,2))
# A B
#1: 4,7 1
#2: 9 2
另一种可能性是存储未评估的表达式(OP真的不清楚OP想要什么,所以我只是在黑暗中拍摄):
d = data.table(A = list(quote(4:7), 9), B = c(1,2))
# A B
#1: <call> 1
#2: 9 2
d[,A]
#[[1]]
#4:7
#
#[[2]]
#[1] 9
lapply(d[, A], eval)
#[[1]]
#[1] 4 5 6 7
#
#[[2]]
#[1] 9
答案 1 :(得分:1)
您可以使用cut
将值转换为您喜欢的任何时间间隔,并为每个时间间隔设置适当的标签,如下所示:
newdf <- sapply( df , cut , breaks = c(1:4,7.01,8:16) , labels = c(1:3,"4-7",8:16) , right = TRUE )
# a b c
# [1,] "3" NA "12"
# [2,] "4-7" "4-7" "12"
# [3,] NA NA "14"
# [4,] "11" NA "16"
# [5,] NA "1" "14"
# [6,] NA "2" "13"
# [7,] "11" NA "13"
# [8,] NA "4-7" "15"
# [9,] "4-7" "2" "16"
#[10,] "4-7" "4-7" "16"
答案 2 :(得分:0)
您想要对这些范围做什么?
一个简单的选择是用2列替换每列,第一列是最小值,第二列是最大值(因此你将有a.min,a.max,b.min等)。您可以通过使最大值为NA
或使最小值和最大值相同来表示精确值。
另一个选项是创建一个存储为列表的新对象,每个行都是长度为1(精确值)或长度为2(范围)的向量。为您的对象编写format
的方法,创建单个值或范围的字符向量(例如4-7),当您打印数据框时,它调用格式函数并最终打印出类似于您的内容如上所示。无论您计划使用这些数据的方式如何,都需要其他方法来处理这些列。